错误LNK2005:quest_tree :: enter_one(类quest_tree :: quest_node *&amp;,类std :: basic_string <char,struct std :: char_traits <char =“”> </char,struct>

时间:2014-09-04 17:43:55

标签: c++

我见过很多关于LNK2005错误的帖子,但无论如何我决定问自己。 这是错误代码:

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<char>,class std::allocator<char> > 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

我正在尝试让程序编译但是在执行此操作时遇到链接器错误,可能是因为我已经将quest_tree.h包含两次,但是当我在setup_quest_tree中删除了quest_tree.h的一个声明时.cpp我遇到了这个错误:

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

有很多文件,所以我只包括与错误相关的项目文件。

setup_quest_tree.cpp:

#ifndef SETUP_QUEST_NODES_CPP
#define SETUP_QUEST_NODES_CPP

#include <string>
#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(只是include语句):

#define DEBUG_LINES_ON

#include <iostream>
#include <fstream>
#include <time.h>

#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 <string>
#include <cstdlib>

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 < (sizeof(new_node->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 < note_to_player)
        enter_one(new_node->right, word);
    else 
        enter_one(new_node->left, word)
*/
}

#endif /* QUEST_TREE_H */

1 个答案:

答案 0 :(得分:0)

您已将实施包含在setup_quest_tree.h标题文件

#include "setup_quest_tree.cpp"

并将其包含在几个翻译单元中 要解决此问题,至少在setup_quest_tree.cpp中只包含setup_quest_tree.h的声明,并从#include "setup_quest_tree.cpp"中删除setup_quest_tree.h语句,以修复链接器错误。

您必须为您的班级提供专门的一个定义(实现)(另请参阅this answer for “将C ++类的定义放入其中是一个很好的做法头文件?“)。

如果你把它放在那里,只是因为你不知道如何将setup_quest_tree.cpp添加到你的程序中,请检查this Q&A,以了解有关链接过程的更多信息。


以下是current c++ standard

的相关部分
  

3.2一个定义规则[basic.def.odr]

     

1 任何翻译单元都不得包含任何变量,函数,类类型,枚举的多个定义   类型或模板。