无法解决循环依赖关系

时间:2016-12-12 07:49:34

标签: c++ class inheritance include

给出以下课程:

// myClass.hpp
class Child1;
class Child2;

class MyClass {
  public:
    virtual void doSomething (const MyClass&) const = 0;
    virtual void doSomething (const Child1&) const = 0;
    virtual void doSomething (const Child2&) const = 0;
};

// child1.hpp
#include "myClass.hpp"

class Child1 : public MyClass {
  public:
    virtual void doSomething (const MyClass&) const override;
    virtual void doSomething (const Child1&) const override;
    virtual void doSomething (const Child2&) const override;
};


// child2.hpp
#include "myClass.hpp"

class Child2 : public MyClass {
  public:
    virtual void doSomething (const MyClass&) const override;
    virtual void doSomething (const Child1&) const override;
    virtual void doSomething (const Child2&) const override;
};

编译器给出了错误:

undefined reference to 'Child1::doSomething(MyClass const&)'

为其他doSomething(..)函数打印相同的错误。

我确定包含文件有一些错误(我为每个头文件使用包含防护!!)。我的问题是:我在哪里必须包含相应的文件以及我需要在哪里进行前向声明?

2 个答案:

答案 0 :(得分:1)

“未定义的引用”看起来像链接器问题。确保你有一个child1.cpp,包括child1.hpp,你可以编译并使用它;并且child1.cpp以正确的方式定义覆盖函数。

答案 1 :(得分:1)

错误告诉您没有对整个方法的引用。

换句话说,您需要在* .cpp文件中或直接在标题中定义方法。例如,请参阅此overview或此similar question。答案告诉你实际上不是编译器错误而是链接器错误。

编辑:正如汉斯奥尔森答案建议的那样,也可能需要include your cpp files

如果你不确切知道实现的样子,但想知道你是否有标题概念,你可以将它们实现为空

virtual void doSomething (const MyClass&) const override {}

或者使用带有标志“-c”的gcc编译代码,该标志告诉gcc enter to just do the compiling not the linking