C ++方法的多重定义或未定义的引用

时间:2018-05-23 13:21:52

标签: c++ compiler-errors

我创建了一个c ++项目,我需要一些方法在我的类中是虚拟的...所以当我在main.cpp中包含“class”.h时,编译器会对我的方法进行未定义的引用以及何时更改“ class“.h to”class“.cpp它首先在main.o中定义,在class.cpp中定义多个定义

class Avl {

public:

    Avlnode* insert(unsigned int key , Avlnode *root);
    AvlofAvlnodes* insert(unsigned int key, unsigned int neighbors[],int size, AvlofAvlnodes *id );

    template <typename nodeptr>
    bool findElement(unsigned int element, nodeptr* root);
    bool findConecion(unsigned int id, unsigned int neighbor,AvlofAvlnodes* root);

    Avlnode* deletion(Avlnode* root,unsigned int key );
    void deletion(unsigned int key , unsigned int neighbor,AvlofAvlnodes* root);

    // methods to help avl
    template <typename nodeptr>
    nodeptr* rightRotate(nodeptr* root);
    template <typename nodeptr>
    nodeptr* leftRotate(nodeptr* root);

    int max(int a,int b);
    template <typename nodeptr>
    int height(nodeptr* root);
    template <typename nodeptr>
    int getBalance(nodeptr* root);
    template <typename nodeptr>
    nodeptr* minValueNode(nodeptr* root);
    template <typename nodeptr>
    void preOrder(nodeptr* node);

};

2 个答案:

答案 0 :(得分:1)

你总是包括&#34; class.h&#34;,永远不包括&#34; class.cpp&#34;。这是因为#include在编译阶段处理,而不同的.cpp文件在链接阶段拼凑在一起。更准确地说,每个.cpp文件都被翻译成一个目标文件,然后将它们链接起来。

缺少的虚拟方法是缺少目标文件的结果。我们知道main.cpp是,但是&#34; class.cpp&#34;编译?

答案 1 :(得分:0)

仅包含hpp文件,然后需要将cpp文件添加到编译器。如果您使用命令行,它应如下所示:

g++ main.cpp class.cpp -o a.out

如果您使用的是C ++ IDE,只要它是项目的一部分,它就会编译class.cpp文件。