[英]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(..)
函数也会输出相同的错误。
我确定在包含文件时会出错(我对每个头文件都使用了包含保护措施!)。 我的问题是:我必须在哪里包括相应的文件,哪里需要前向声明?
“未定义的引用”看起来像一个链接器问题。 确保您拥有一个child1.cpp(包括child1.hpp)并进行编译和使用; 并且child1.cpp以正确的方式定义了覆盖函数。
该错误告诉您没有对整个方法的引用。
换句话说,您需要在* .cpp文件中或直接在标题中定义方法。 例如,请参阅此概述或类似问题 。 答案告诉您这实际上不是编译器错误,而是链接器错误。
编辑:正如汉斯·奥尔森答案所暗示的,也可能是您需要包括cpp文件 。
如果您不完全了解实现的外观,但是想了解标头概念是否有效,可以将其实现为空
virtual void doSomething (const MyClass&) const override {}
或者使用带有标志“ -c”的gcc编译您的代码,该代码告诉gcc enter仅进行编译而不是链接 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.