2014-02-17 8 views
1

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

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

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)" ([email protected]@YAXXZ) already defined in Conjugator.obj 
1>ErVerbs.obj : error LNK2005: "void __cdecl erVerbs(void)" ([email protected]@$$FYAXXZ) already defined in Conjugator.obj 
1>IrVerbs.obj : error LNK2005: "void __cdecl irVerbs(void)" ([email protected]@YAXXZ) already defined in Conjugator.obj 
1>IrVerbs.obj : error LNK2005: "void __cdecl irVerbs(void)" ([email protected]@$$FYAXXZ) already defined in Conjugator.obj 
1>ReVerbs.obj : error LNK2005: "void __cdecl reVerbs(void)" ([email protected]@YAXXZ) already defined in Conjugator.obj 
1>ReVerbs.obj : error LNK2005: "void __cdecl reVerbs(void)" ([email protected]@$$FYAXXZ) already defined in Conjugator.obj 

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

ответ

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», и то же самое для других ваших функций.

+0

Я читал, что я никогда не должен # включать файл .cpp, но я не знал, как определите его с помощью операторов #if и #define – user3182445

+0

Спасибо за помощь: ') – user3182445

1

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

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

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

void erVerbs(); 

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

#include "ErVerbs.h" 
+0

Но в каком файле .cpp я действительно определяю функцию? – user3182445

0

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

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

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

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

0

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

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

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

+0

Я не осведомлен о концепции защиты заголовков, но я обязательно ее просмотрю, спасибо за ваше предложение: ') – user3182445