我有一个纯C ++代码,有两个类:Dictionary和Training。 我想使用这些类创建一个WinForms项目。所以,我有两种形式,需要与两者共享我的类成员,就像一个全局变量。我试图以这种方式制作它,是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;
}
第二种形式的一部分:
//ExploreForm.h
public ref class ExploreForm : public System::Windows::Forms::Form
{
private: Dictionary *dict;
public:
ExploreForm(Dictionary *aDict)
{
InitializeComponent();
dict = aDict;
}
在所有标题中,我有#ifndef或#pragma一次,但我仍然得到奇怪的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
如何在两个表单之间共享我的本机C ++类成员? 我知道,关于lnk2005有很多问题,但我真的有任何想法。
答案 0 :(得分:4)
您正在头文件中定义方法。当您将该头文件包含在多个翻译单元中时,这意味着有多个定义。这就是链接器在说出来时抱怨的内容:
.... already defined ....
将方法的定义移出.h文件并移入.cpp文件。
答案 1 :(得分:2)
除了David Heffernan所说的话:
将您的定义移出.h文件并转移到.cpp文件中。
您还可以inline
这些功能或者使用template
。然后将其中一个放入.h文件中。但是,这会产生更多的开销,从而产生更大的文件大小。