0

globaldata.h では、typedef 構造体を GlobalData として定義しています。メインの cpp プログラムでは、globaldata.h をインクルードしてから、GlobalData globalData を宣言して
います。

その宣言の後に、createNetDialog.h と gui.h を含めます。gui.h で globalData しか参照できないのに、createNetDialog.h を参照できないのはなぜですか? プリコンパイル中に両方のインクルード ファイルを .cpp ファイルに貼り付ける必要があるため、globalData は両方に表示されるはずです。

ここで定義された GlobalData 構造があります:
globaldata.h

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

私のC++コードには、次のものがあります:
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));
           }
        }
    };
}

助けてくれてありがとう

4

1 に答える 1

0

はい、 gui.cppからコンパイルすると、globalData は gui.h と createNetDialog.h の両方で表示されます。globalData.h で定義したのはtypeであり、その型のグローバル変数ではありません。他の cpp ファイルからコンパイルすると、gui.h と createNetDialog.h は gui.cpp のグローバル変数の宣言を認識できません。

やりたいことは次のexternとおりです。globalData.h で型とグローバル変数の両方を宣言します。使用するすべてのファイルから globalData.h をインクルードします。使用するファイルの前に他のファイルにインクルードしたことに依存しないでください。1 つの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;
于 2013-05-04T16:17:20.813 に答える