LNK2005, C / CLI, без понятия

#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. Однако это приводит к увеличению накладных расходов, следовательно, к увеличению размеров файлов.