переопределение — переопределение функций при включении файлов в C ++ (ошибка LNK2005)

Я новичок в C ++, и у меня есть основные сомнения.
Я создаю французское приложение для спряжения глаголов.
У меня есть два файла, файл Conjugator.cpp и файл ErVerbs.cpp.
Я хочу сохранить большую часть своих функций в исходном файле ErVerbs и использовать конъюгатор
файл для использования этих функций.

Вот несколько фрагментов кода:

Conjugator.cpp

#include <iostream>
#include <string>
#include "Variables.h"#include "ErVerbs.cpp"#include "IrVerbs.cpp"#include "ReVerbs.cpp"using namespace std;

void check()
{
if (verb.substr(len - 2, len) == "er")
erVerbs();
else if (verb.substr(len - 2, len) == "ir")
irVerbs();
else if (verb.substr(len - 2, len) == "re")
reVerbs();
}
int main()
{
cout << "Enter verb : ";
getline(cin, verb);
cout << "Enter tense : ";
getline(cin, tense);
len = verb.length();
check();
}

ErVerbs.cpp

#include <iostream>
#include <string>
using namespace std;

void erVerbs()
{
cout << "er Verb"; cin.get();
}

Точно так же у меня есть три других таких исходных файла .cpp с похожими функциями.

Когда я собираю программу, я получаю сообщение об ошибке, что каждый из используемых мной методов был определен
уже.

1>ErVerbs.obj : error LNK2005: "void __cdecl erVerbs(void)" (?erVerbs@@YAXXZ) already  defined in Conjugator.obj
1>ErVerbs.obj : error LNK2005: "void __cdecl erVerbs(void)" (?erVerbs@@$$FYAXXZ) already defined in Conjugator.obj
1>IrVerbs.obj : error LNK2005: "void __cdecl irVerbs(void)" (?irVerbs@@YAXXZ) already defined in Conjugator.obj
1>IrVerbs.obj : error LNK2005: "void __cdecl irVerbs(void)" (?irVerbs@@$$FYAXXZ) already defined in Conjugator.obj
1>ReVerbs.obj : error LNK2005: "void __cdecl reVerbs(void)" (?reVerbs@@YAXXZ) already defined in Conjugator.obj
1>ReVerbs.obj : error LNK2005: "void __cdecl reVerbs(void)" (?reVerbs@@$$FYAXXZ) already defined in Conjugator.obj

Я был бы чрезвычайно признателен, если бы кто-нибудь сказал мне, как сохранить функции в отдельных исходных файлах и включить их в один исходный файл и использовать их функции без ошибок переопределения.

1

Решение

Dont:

#include "ErVerbs.cpp"

в Conjugator.cpp это то, что вызывает ошибки вашего компоновщика. Включая ваши cpp файлы, вы снова переопределяете эту функцию.

Вы должны создать файл ErVerbs.h и поместить в него объявление для вашей функции:

#if !defined(ER_VERBS_H)
#define(ER_VERBS_H)
void erVerbs();
#endif

и в Conjugator.cpp включите #include «ErVerbs.h», и то же самое для других ваших функций.

1

Другие решения

Вы никогда не должны включать файлы * .cpp. Удалить следующее

#include "ErVerbs.cpp"#include "IrVerbs.cpp"#include "ReVerbs.cpp"

Создайте erVerbs.h со следующим содержимым:

void erVerbs();

и включите его в Conjugator.cpp

#include "ErVerbs.h"
1

Как вы включили модули

#include "ErVerbs.cpp"#include "IrVerbs.cpp"#include "ReVerbs.cpp"

в модуле Conjugator.cpp все четыре модуля содержат определения функций, и об этом говорит компилятор.

Вы должны объявить функции в некотором заголовочном файле и включить его во все модули, которые используют эти функции, в то время как их определения хранятся в одном модуле (или среди нескольких модулей), который не будет включен ни в один другой модуль.

0

Вы #including .cpp файл из другого .cpp fileпоэтому определение функции будет существовать в двух местах.

Что вы, вероятно, хотите сделать, это создать Conjugator.h заголовочный файл, декларирующий (но не определяя) функцию, и включите ее вместо этого.

Также посмотрите заголовок охранников (или #pragma onceв то время как вы на это, если вы не знаете, как предотвратить несколько объявлений в .h файлы.

0
По вопросам рекламы [email protected]