无法解析循环依赖性
Unable to resolve circular dependency
给定以下类:
// 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以正确的方式定义了覆盖函数。
相关文章: