Я новичок в 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
Я был бы чрезвычайно признателен, если бы кто-нибудь сказал мне, как сохранить функции в отдельных исходных файлах и включить их в один исходный файл и использовать их функции без ошибок переопределения.
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», и то же самое для других ваших функций.
Вы никогда не должны включать файлы * .cpp. Удалить следующее
#include "ErVerbs.cpp"#include "IrVerbs.cpp"#include "ReVerbs.cpp"
Создайте erVerbs.h со следующим содержимым:
void erVerbs();
и включите его в Conjugator.cpp
#include "ErVerbs.h"
Как вы включили модули
#include "ErVerbs.cpp"#include "IrVerbs.cpp"#include "ReVerbs.cpp"
в модуле Conjugator.cpp все четыре модуля содержат определения функций, и об этом говорит компилятор.
Вы должны объявить функции в некотором заголовочном файле и включить его во все модули, которые используют эти функции, в то время как их определения хранятся в одном модуле (или среди нескольких модулей), который не будет включен ни в один другой модуль.
Вы #including
.cpp
файл из другого .cpp file
поэтому определение функции будет существовать в двух местах.
Что вы, вероятно, хотите сделать, это создать Conjugator.h
заголовочный файл, декларирующий (но не определяя) функцию, и включите ее вместо этого.
Также посмотрите заголовок охранников (или #pragma once
в то время как вы на это, если вы не знаете, как предотвратить несколько объявлений в .h
файлы.