#c #winforms #visual-studio-2013 #command-line-interface #lnk2005
#c #winforms #visual-studio-2013 #интерфейс командной строки #lnk2005
Вопрос:
У меня есть чистый код на C , есть два класса: словарь и обучение. Я хотел бы создать проект 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, но у меня действительно есть какие-то идеи.
Комментарии:
1. вы пробовали использовать защиту заголовков во всех ваших файлах h?
2. да, я использую его везде.
3. они отсутствуют в MyForm.h
4. Какие символы вызывают LNK2005? Эти ошибки типичны при несоответствии или пропущенных символах. В этом случае я подозреваю, что это может быть вызвано смешанным использованием переключателя
/clr
компилятора.5. о, я только что добавил это
Ответ №1:
Вы определяете свои методы в заголовочном файле. Когда вы включаете этот файл заголовка в несколько единиц перевода, это означает, что существует несколько определений. Это то, на что жалуется компоновщик, когда говорит:
.... already defined ....
Переместите определения методов из файлов .h в файлы .cpp.
Комментарии:
1. Да, это решение. Спасибо большое, на самом деле.
Ответ №2:
В дополнение к тому, что сказал Дэвид Хеффернан:
Переместите свои определения из файлов .h в файлы .cpp.
Вы также можете inline
использовать эти функции или использовать template
их. Затем любой из них будет помещен в ваш файл .h. Однако это приводит к увеличению накладных расходов, следовательно, к увеличению размеров файлов.