簡體   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