2013-05-04 3 views
0

В globaldata.h Я определяю структуру typedef как GlobalData. В моей основной программе cpp я включаю globaldata.h, затем объявляю
GlobalData globalData;

После этого объявления я включаю createNetDialog.h и gui.h. Почему я могу ссылаться только на globalData в gui.h, но не на createNetDialog.h? Оба файла включают файлы, которые должны быть вставлены в мой .cpp-файл во время предварительной компиляции, так что globalData должен быть видимым как справа?Не удается получить доступ к глобальным переменным

Я структура GlobalData определяется здесь:
globaldata.h

typedef struct { 
    string netFilename; 
    DataFileReader *dataFileReader; 
} GlobalData; 

В моем с ++ кода, у меня есть:
gui.cpp

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include "DataFileReader.h" 
#include "globaldata.h" 

GlobalData globalData; 

#include "createNetDialog.h" 
#include "gui.h" 


using namespace System; 
using namespace System::Windows::Forms; 
using namespace std; 

[STAThread] 
void Main(array<String^>^ args) 
{ 
    Application::EnableVisualStyles(); 
    Application::SetCompatibleTextRenderingDefault(false); 

    Carnac::gui formMain; 
    Application::Run(%formMain); 
} 


createNetDialog.h (в конструкторе createNetDialog)

#pragma once 


namespace Carnac { 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 

    /// <summary> 
    /// Summary for createNetDialog 
    /// </summary> 
    public ref class createNetDialog : public System::Windows::Forms::Form 
    { 
    public: 
     createNetDialog(void) 
     { 
      InitializeComponent(); 

      // left of '.size' must have a class/struct/union 
      // left of '.dataFileReader' must have a class/struct/union 
      // 'globalData':undeclared identifier despite being declared right before 
      // this file is included in the .cpp file 
      for (unsigned int i=0; i<globalData.dataFileReader->_headerItems.size(); i++) 
      { 
          // do something 
      } 
     } 

    protected: 
     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     ~createNetDialog() 
     { 
      if (components) 
      { 
       delete components; 
      } 
     } 
    protected: 

    protected: 

    private: System::Windows::Forms::Button^ buttonCreate; 
    private: System::Windows::Forms::Button^ buttonCreateCancel; 




    private: 
     System::ComponentModel::Container ^components; 

#pragma region Windows Form Designer generated code 
     void InitializeComponent(void) 
     { 
      this->buttonCreate = (gcnew System::Windows::Forms::Button()); 
      this->buttonCreateCancel = (gcnew System::Windows::Forms::Button()); 
      this->SuspendLayout(); 
      // 
      // buttonCreate 
      // 
      this->buttonCreate->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left)); 
      this->buttonCreate->Location = System::Drawing::Point(16, 288); 
      this->buttonCreate->Name = L"buttonCreate"; 
      this->buttonCreate->Size = System::Drawing::Size(75, 23); 
      this->buttonCreate->TabIndex = 7; 
      this->buttonCreate->Text = L"Create"; 
      this->buttonCreate->UseVisualStyleBackColor = true; 
      // 
      // buttonCreateCancel 
      // 
      this->buttonCreateCancel->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Right)); 
      this->buttonCreateCancel->Location = System::Drawing::Point(404, 288); 
      this->buttonCreateCancel->Name = L"buttonCreateCancel"; 
      this->buttonCreateCancel->Size = System::Drawing::Size(75, 23); 
      this->buttonCreateCancel->TabIndex = 8; 
      this->buttonCreateCancel->Text = L"Cancel"; 
      this->buttonCreateCancel->UseVisualStyleBackColor = true; 
      this->buttonCreateCancel->Click += gcnew System::EventHandler(this, &createNetDialog::buttonCreateCancel_Click); 
      // 
      // createNetDialog 
      // 
      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
      this->ClientSize = System::Drawing::Size(491, 323); 
      this->Controls->Add(this->buttonCreateCancel); 
      this->Controls->Add(this->buttonCreate); 
      this->Name = L"createDialog"; 
      this->Text = L"CreateDialog"; 
      this->ResumeLayout(false); 
      this->PerformLayout(); 

     } 
#pragma endregion 
    private: System::Void buttonCreateCancel_Click(System::Object^ sender, System::EventArgs^ e) 
    { 
       this->Close(); 
    } 
}; 
} 


gui.h (в конце)

#pragma once 

#include <msclr\marshal_cppstd.h> 

namespace Carnac { 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 

    /// <summary> 
    /// Summary for gui 
    /// </summary> 
    public ref class gui : public System::Windows::Forms::Form 
    { 
     public: 
     gui(void) 
     { 
      InitializeComponent(); 
      // 
      //TODO: Add the constructor code here 
      // 
     } 

     protected: 
     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     ~gui() 
     { 
      if (components) 
      { 
       delete components; 
      } 
     } 
     protected: 

     private: int _dataColumnSelected; 
     private: System::Windows::Forms::Button^ buttonLoad; 

     private: 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     System::ComponentModel::Container ^components; 

#pragma region Windows Form Designer generated code 
     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     void InitializeComponent(void) 
     { 
      this->buttonLoad = (gcnew System::Windows::Forms::Button()); 
      this->SuspendLayout(); 
      // 
      // buttonLoad 
      // 
      this->buttonLoad->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left)); 
      this->buttonLoad->Text = L"Load Data"; 
      this->buttonLoad->UseVisualStyleBackColor = true; 
      this->buttonLoad->Click += gcnew System::EventHandler(this, &gui::buttonLoad_Click); 
      this->buttonLoad->Location = System::Drawing::Point(67, 66); 
      this->buttonLoad->Name = L"buttonLoad"; 
      this->buttonLoad->Size = System::Drawing::Size(75, 23); 
      this->buttonLoad->TabIndex = 0; 
      this->buttonLoad->UseVisualStyleBackColor = true; 
      // 
      // gui 
      // 
      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
      this->BackColor = System::Drawing::SystemColors::AppWorkspace; 
      this->ClientSize = System::Drawing::Size(234, 171); 
      this->Controls->Add(this->buttonLoad); 
      this->Name = L"gui"; 
      this->Text = L"Carnac"; 
      this->ResumeLayout(false); 

     } 
#pragma endregion 
     static std::string toStandardString(System::String^ string) 
     { 
      using System::Runtime::InteropServices::Marshal; 
      System::IntPtr pointer = Marshal::StringToHGlobalAnsi(string); 
      char* charPointer = reinterpret_cast<char*>(pointer.ToPointer()); 
      std::string returnString(charPointer, string->Length); 
      Marshal::FreeHGlobal(pointer); 
      return returnString; 
     } 

     private: System::Void buttonPredictRun_Click(System::Object^ sender, System::EventArgs^ e) 
     { 
     } 
     private: System::Void buttonTestLoad_Click(System::Object^ sender, System::EventArgs^ e) 
     { 
     } 
     private: System::Void buttonLoad_Click(System::Object^ sender, System::EventArgs^ e) 
     { 
      OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog; 

      openFileDialog1->Filter = "Data Files|*.dat"; 

      if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) 
      { 
       ifstream inFile; 

       String^ strfilename = openFileDialog1->InitialDirectory + openFileDialog1->FileName; 

       // THIS WORKS 
       // Why can I use globalData here but not in createNetDialog.h? 
       globalData.dataFileReader = new DataFileReader(toStandardString(strfilename)); 
      } 
     } 
    }; 
} 

Спасибо за любую помощь

ответ

0

Да, GlobalData видна в обоих gui.h и createNetDialog.h, при компиляции с графическим интерфейсом. cpp. В globalData.h все, что вы определили, это тип, а не глобальная переменная этого типа. При компиляции из любого другого файла cpp gui.h и createNetDialog.h не могут видеть объявление глобальной переменной в gui.cpp.

Вот что вы хотите сделать: объявить как тип, так и глобальную переменную extern в globalData.h. Включите globalData.h из каждого файла, в который вы хотите его использовать, не полагайтесь на другие файлы, чтобы включить его до того, который вы хотите использовать. В только один файл cpp (в настоящее время gui.cpp), объявляют фактическая глобальная переменная.

// globalData.h 
#include "DataFileReader.h" 
typedef struct { 
    string netFilename; 
    DataFileReader *dataFileReader; 
} GlobalData; 

extern GlobalData globalData; 

.

// EVERY file where you use globalData 
#include "globalData.h" 

.

// gui.cpp 
#include "globaldata.h" 

GlobalData globalData; 
+0

Я попробовал ваше решение, но получил тот же результат. Единственным .cpp-файлом, в который я включаю globaldata.h, является gui.cpp. Но да, ваш путь был бы лучше, если бы я включил его в другие .cpp-файлы, и я буду поддерживать его таким образом для будущего роста. Но пока он включен только в файл gui.cpp. – user2350086

+0

Приношу свои извинения. Был создан файл createNetDialog.cpp, созданный визуальной студией, поэтому у меня не было globaldata.h, включенного в этот файл. Спасибо за помощь! – user2350086

Смежные вопросы