Многократно определенные символы (C ++) - PullRequest
2 голосов
/ 24 марта 2020

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

У меня есть следующие файлы

CardBase.h

#include <string>
#include <vector>
#include <map>

class Class1 {
    string someString;
    vector<type> someVector;
    map<type,type> someMap;
    type someMethod (param);
}

CardBase. cpp

#include "StringParser.cpp"

someType Class1::someMethod (param){
    // Use splitAtChar()
}

StringParser. cpp

#include <string>
#include <vector>

someType splitAtChar(){
    ...
}

Это приводит к двум ошибкам в коде VS:

LNK2005 "class std :: vector , класс std :: allocator >> __cdecl splitAtChar (класс std :: basic_string , char) "(? splitAtChar @@ YA? AV? $vector@V?$basic_string@DU?$char_traits@D@std@@V? $allocator@D@2@@std@@V? $allocator@V?$basic_string@DU?$char_traits@D@std@@V? $allocator@D@2@@std@@@2@@std@@V? $basic_string@DU?$char_traits@D@std@@V? $allocator@D@2@@2@D@Z) уже определено в CardBase.obj

и

найден один или несколько кратно определенных символов

Ответы [ 2 ]

4 голосов
/ 24 марта 2020

Да, не включайте один cpp файл в другой. Используйте заголовочные файлы.

CardBase. cpp

#include "StringParser.h"

someType Class1::someMethod (param){
    // Use splitAtChar()
}

StringParser. cpp

#include "StringParser.h"
#include <string>
#include <vector>

someType splitAtChar(){
    ...
}

StringParser.h

#ifndef STRING_PARSER_H
#define STRING_PARSER_H

someType splitAtChar();

#endif

Это основа c, ваша книга по C ++ должна объяснить, как организовать ваш код.

2 голосов
/ 24 марта 2020

В вашей CardBase. cpp

#include "StringParser.cpp"

someType Class1::someMethod (param){
    // Use splitAtChar()
}

Вы включаете файл. cpp. Если вы дополнительно скомпилируете это, то вы дважды определяете splitAtChar () и, следовательно, ошибки.

...