1

У меня есть файл long_arithm.cpp:Multiple определение метода класса

#ifndef LONG_ARITHM.CPP 
#define LONG_ARITHM.CPP 

#include <iostream> 
#include <list> 

namespace long_arithm { 

    typedef signed char schar; 
    enum { error_char = 127 }; 

    class longint { 
    public: 
     longint() : minusSign(0), array() { } 
     longint(int num) { fromInt(num); } 
     longint(std::string str) { fromString(str); } 
     longint(const longint& other) : minusSign(other.minusSign), array(other.array) { } 

     void fromInt(int num); 
     void fromString(std::string str); 

    protected: 
     schar digtochar(schar num); 
     schar chartodig(schar ch); 

     inline bool isDigit(schar ch) { /* code */ } 
     inline bool isSpaceChar(schar ch) { /* code */ } 

    private: 
     bool minusSign; 
     std::list<schar> array; 
    }; 
}; 


void long_arithm::longint::fromInt(int num) { 
    /* code */ 
} 

void long_arithm::longint::fromString(std::string str) { 
    /* code */ 

long_arithm::schar long_arithm::longint::digtochar(schar num) { 
    /* code */ 
} 

long_arithm::schar long_arithm::longint::chartodig(schar ch) { 
    /* code */ 
} 

#endif 

Теперь я пытаюсь построить его, но у меня есть ошибки (1-й и 2-й линии - заголовок Eclipce):

Building target: long_arithmetics 
Invoking: Cross G++ Linker 
g++ -o "long_arithmetics" ./long_arithm.o ./main.o 
./main.o: In function `long_arithm::longint::fromInt(int)': 
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:153: multiple definition of `long_arithm::longint::fromInt(int)' 
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:153: first defined here 
./main.o: In function `long_arithm::longint::fromString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)': 
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:168: multiple definition of `long_arithm::longint::fromString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:168: first defined here 
./main.o: In function `long_arithm::longint::chartodig(signed char)': 
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:204: multiple definition of `long_arithm::longint::chartodig(signed char)' 
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:204: first defined here 
./main.o: In function `long_arithm::longint::digtochar(signed char)': 
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:188: multiple definition of `long_arithm::longint::digtochar(signed char)' 
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:188: first defined here 

(Обратите внимание, что линии связи (например: 188) сломаны, потому что я выкинул много прокомментированных строк кода.)

Почему у меня такие ошибки и что я должен исправить? Насколько я понимаю,

void fromInt(int num); 

и другие являются «предварительными определениями», и я не вижу других определений этих методов.

Благодарим за помощь.

+5

Почему у вас есть защитники заголовков внутри .cpp-файла? Вы пытаетесь их включить? – parallelgeek

+0

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

+0

@parallelgeek Да, я включаю этот файл в main.cpp, но я использую этот файл (main.cpp) только для тестирования кода в long_arithm.cpp –

ответ

6

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

1

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

+0

Нет, извините, я удалил эту скобку при копировании, но у меня есть ее в исходном коде. Я редактировал сообщение, –

3

Вы говорите, что вы включили long_arithm.cpp в основной. Но вы также компилируете его отдельно, а затем попытаетесь связать результат с main.o. Вот что вызывает дубликаты.

Смежные вопросы