error LNK2005: quest_tree :: enter_one (clase quest_tree :: quest_node * &, class std :: basic_string <char, struct std :: char_traits

He visto muchas publicaciones sobre el error LNK2005, pero decidí preguntarme de todas maneras. Aquí está el código de error:

1>setup_quest_tree.obj : error LNK2005: "private: void __thiscall quest_tree::enter_one(class quest_tree::quest_node * &,class std::basic_string<char,struct std::char_traits,class std::allocator > const &)" (?enter_one@quest_tree@@AAEXAAPAVquest_node@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in mainFunction.obj 1>setup_quest_tree.obj : error LNK2005: "void __cdecl setup_quest_tree(void)" (?setup_quest_tree@@YAXXZ) already defined in mainFunction.obj 1>C:\Users\Timothy\Documents\Visual Studio 2008\Projects\ttbag\Debug\TTBAG.exe : fatal error LNK1169: one or more multiply defined symbols found 

Estoy tratando de hacer que el progtwig se compile, pero me estoy encontrando con errores de vinculador mientras lo hago, probablemente porque he incluido quest_tree.h dos veces, pero cuando me deshice de una de las declaraciones de quest_tree.h en setup_quest_tree.cpp I ejecutar en este error:

 1>c:\users\timothy\documents\visual studio 2008\projects\ttbag\ttbag\setup_quest_tree.cpp(8) : error C2065: 'quest_tree' : undeclared identifier 

Hay muchos archivos, así que solo incluyo los que están relacionados con el proyecto para mi proyecto.

setup_quest_tree.cpp:

 #ifndef SETUP_QUEST_NODES_CPP #define SETUP_QUEST_NODES_CPP #include  #include "quest_tree.h" void setup_quest_tree() { quest_tree quest_tree_obj; //start out with two quest nodes std::string welcome_message = "debug-welcome message"; quest_tree_obj.enter(welcome_message); } #endif 

setup_quest_tree.h:

 #ifndef SETUP_QUEST_TREE_H #define SETUP_QUEST_TREE_H #include "quest_tree.h" #include "setup_quest_tree.cpp" //function declarations void setup_quest_tree (quest_tree &quest_tree_obj); #endif /* SETUP_QUEST_TREE_H */ 

mainFunction.cpp (solo las declaraciones de inclusión):

 #define DEBUG_LINES_ON #include  #include  #include  #include "weather.h" #include "item.h" #include "map.h" #include "person.h" #include "location.h" #include "bag.h" #include "equipped_items.h" #include "global_vars.h" #include "setup_quest_tree.h" int main() { ... 

quest_tree.h:

 #ifndef QUEST_TREE_H #define QUEST_TREE_H #include  #include  class quest_tree { private: // the basic node of the tree. Do way to read from file? class quest_node { private: quest_node *quest_nodes; // pointer to array of quests that activate upon quest activation public: //std::string word; // we will replace this with our own data variable std::string note_to_player; //note that is shown upon quest activation /* quest_node(){ // default constructor note_to_player = ""; } */ quest_node(short int num_nodes = 2){ quest_nodes = new quest_node[num_nodes]; // problem: not declared in quest_tree but rather in quest_node note_to_player = ""; } friend class quest_tree; }; // the top of the tree quest_node * root; // Enter a new node into the tree or sub-tree void enter_one(quest_node *&node, const std::string& note_to_player); public: quest_tree() {root = NULL;} // constructor // Add a new note_to_player to our tree void enter(std::string& note_to_player) { enter_one(root, note_to_player); } }; void quest_tree::enter_one(quest_node *&new_node, const std::string& note_to_player) { // see if we have reached the end if (new_node == NULL) { new_node = new quest_node; for (short int index = 0; index quest_nodes)/sizeof(new_node->quest_nodes[0])); index++) { // initialize quest_nodes new_node->quest_nodes[index] = NULL; } new_node->note_to_player = note_to_player; } if (new_node->note_to_player == note_to_player) return; /* if (new_node->note_to_player right, word); else enter_one(new_node->left, word) */ } #endif /* QUEST_TREE_H */ 

Ha incluido la implementación en el archivo de cabecera setup_quest_tree.h

 #include "setup_quest_tree.cpp" 

y lo incluyó en varias unidades de traducción.
Para solucionar este problema, al menos en setup_quest_tree.cpp simplemente incluya las declaraciones de setup_quest_tree.h , y elimine la statement #include "setup_quest_tree.cpp" de setup_quest_tree.h para corregir los errores del enlazador.

Debe proporcionar exclusivamente una definición (implementación) para su clase (consulte también esta respuesta para “¿Es una buena práctica colocar la definición de clases de C ++ en el archivo de encabezado?” ).

Si lo setup_quest_tree.cpp allí, solo porque no sabes cómo agregar setup_quest_tree.cpp a tu progtwig, consulta esta setup_quest_tree.cpp de preguntas y respuestas para obtener más información sobre el proceso de vinculación.


Aquí está la sección relevante del estándar actual de c ++

3.2 Una regla de definición [basic.def.odr]

1 Ninguna unidad de traducción contendrá más de una definición de cualquier variable, función, tipo de clase, tipo de enumeración o plantilla.