1

私は純粋な C++ コードを持っています。Dictionary と Training の 2 つのクラスがあります。これらのクラスを使用して WinForms プロジェクトを作成したいと思います。したがって、2 つのフォームがあり、グローバル変数のようにクラス メンバーを両方で共有する必要があります。MyForm.h の一部として、そのようにしようとしました。

//MyForm.h , first(main form)
public ref class MyForm : public System::Windows::Forms::Form
{
private:
    Dictionary *dict;
    Training *train;
    string *fileName;
public:
    MyForm(void)
    {
        InitializeComponent();
        dict = new Dictionary;
        train = new Training;
        fileName = new string;
    }

いくつかのイベントがあります:

 private: System::Void exploremanageToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
         msclr::interop::marshal_context context;
         ExploreForm^ eForm = gcnew ExploreForm(dict);
         eForm->Show();
         int rowCount;
         vector<string> str;
         str = dict->getAllWords(inverted);
         eForm->DGV->RowCount = str.size();
         for (int i = 0; i < str.size(); i++)
             eForm->DGV->Rows[i]->Cells[0]->Value = context.marshal_as<String^>(str[i]);
         eForm->buttonDelete->Enabled = false;
         eForm->buttonEdit->Enabled = false;
         eForm->textBoxEdit->Visible = false;


}

2 番目のフォームの一部:

//ExploreForm.h
public ref class ExploreForm : public System::Windows::Forms::Form
{
private: Dictionary *dict;
public:
    ExploreForm(Dictionary *aDict)
    {
        InitializeComponent();
        dict = aDict;
    }

すべてのヘッダーで、#ifndef または #pragma を 1 回使用していますが、依然として奇妙な LNK2005 エラーが発生します。

完全なコード:

MyForm.h : https://codeo.me/5mO

ExploreForm.h : https://codeo.me/5mI

globals.h: https://codeo.me/5mJ

globals.cpp: https://codeo.me/5mK

Dictionary.h: https://codeo.me/5mL

MyForm.cpp: https://codeo.me/5mP

2 つのフォーム間でネイティブ C++ クラス メンバーを共有するにはどうすればよいですか? lnk2005 について多くの質問があることは承知していますが、何かアイデアはあります。

4

2 に答える 2

4

ヘッダー ファイルでメソッドを定義しています。そのヘッダー ファイルを複数の翻訳単位に含める場合、それは複数の定義があることを意味します。それが、リンカーが言うときに不平を言っていることです:

.... already defined ....

メソッドの定義を .h ファイルから .cpp ファイルに移動します。

于 2014-06-26T12:38:07.060 に答える