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