В 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));
}
}
};
}
Спасибо за любую помощь
Я попробовал ваше решение, но получил тот же результат. Единственным .cpp-файлом, в который я включаю globaldata.h, является gui.cpp. Но да, ваш путь был бы лучше, если бы я включил его в другие .cpp-файлы, и я буду поддерживать его таким образом для будущего роста. Но пока он включен только в файл gui.cpp. – user2350086
Приношу свои извинения. Был создан файл createNetDialog.cpp, созданный визуальной студией, поэтому у меня не было globaldata.h, включенного в этот файл. Спасибо за помощь! – user2350086