繁体   English   中英

无法解决循环依赖

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM