无法解析循环依赖性

Unable to resolve circular dependency

本文关键字:循环 依赖性      更新时间:2023-10-16

给定以下类:

// 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文件或直接在标题中定义该方法。例如,请参见此概述或此类似的问题。答案告诉您实际不是编译器错误,而是链接器错误。

编辑:正如汉斯·奥尔森(Hans Olsson)的回答所暗示的那样,也可能是您需要包含CPP文件。

如果您不完全知道实现的样子,但想知道您是否可以使用标头概念,则可以空

实现它们
virtual void doSomething (const MyClass&) const override {}

或与gcc的编译器一起使用标志" -c",该标志告诉gcc enter以进行编译而不是链接。

"未定义的参考"看起来像一个链接器问题。确保您有一个child1.cpp,包括child1.hpp,并与之编译;该孩子1.cpp以正确的方式定义了覆盖函数。