【问题标题】:Unable to resolve circular dependency无法解决循环依赖
【发布时间】:2017-04-27 01:10:05
【问题描述】:

给定以下类:

// 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(..) 函数会打印相同的错误。

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

【问题讨论】:

  • 请检查您的 cpp 文件,如果它们甚至已编译,请添加更多代码,以便我们查看您拥有的全部内容。

标签: c++ class inheritance include


【解决方案1】:

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

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

编辑:正如 Hans Olsson Answer 建议的那样,您也可能需要include your cpp files

如果您不完全了解实现的外观,但想知道您的标头概念是否有效,您可以空实现它们

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

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

【讨论】:

  • 你说得对。实际上,这是链接而不是编译的问题。从现在开始,我是“-c”编译器标志的忠实粉丝:)
  • 但请注意,它不是“eierlegende wollmilchsau”(不知道如何翻译)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 2020-12-29
    • 1970-01-01
    • 2013-02-04
    • 2010-10-27
    相关资源
    最近更新 更多