所以,我在這裏一個問題:C++包含頭文件
類A需要知道B類,B類需要知道C和C類需要知道A. 它本質一個圓圈,所以我得到了定義錯誤。我嘗試了向前的聲明,但無論頂部,還是不知道底部還有什麼。
我該如何處理這種情況?
感謝
大衛
所以,我在這裏一個問題:C++包含頭文件
類A需要知道B類,B類需要知道C和C類需要知道A. 它本質一個圓圈,所以我得到了定義錯誤。我嘗試了向前的聲明,但無論頂部,還是不知道底部還有什麼。
我該如何處理這種情況?
感謝
大衛
假設這個使用指針是簡單的東西,上面亞當Mihalcin的評論是正確的,該類似的問題回答了它。但是我會把它編碼出來。
假設你有這樣的(方法的定義並不重要):
class A
{
B* ptrB;
}
class B
{
C* ptrC;
}
class C
{
A* ptrA;
}
然後你可以像亞當掛,只是向前delcare這樣他們的所有3:
class A;
class B;
class C;
並把它放在它們全部3個之上。這裏的重要事情是,這是當指針指向其他類,而不是作爲類的一部分的組合。您可以使用前向聲明來處理指針時正確編譯的內容,但不能與其他數據類型一起編譯。因此,如果有是這樣的:
class D
{
B myB;
}
隨着一切上面一樣,你需要有「真正」的定義B的正上方爲D.「真正」的定義,但剩下的可能是相同的。前向聲明只適用於指針。
你必須用指針指向你的依賴循環。如果沒有指針,那麼數據結構是「無限的」,因此不起作用。這是因爲在我的例子中,一個D 總是包含一個B.但是如果一個A總是包含一個B,而一個B總是包含一個C,而一個C總是包含一個A?那麼最後的A需要另一個B,這需要另一個C,這......我希望你明白。但用指針,你可以循環它。隨着組成(不是指針)它不能循環。
如果類是緊耦合的,那麼你就可以
否則,您可以
但很可能你有一個設計級別的錯誤,如果是這樣,只是解決這個問題。
你可以做的是向前聲明A類在C類的頭文件,那麼你在.cpp文件中,你包括A類
頁眉有關如何轉發聲明引用A級,看看這個參考 - Forward declarations in C++
最有可能的,我剛剛得到了設計級別的錯誤。然而,如果你必須這樣做,例如,試着通過聲明一個空的類A,B而不用在C的頭文件中提供任何細節實現來利用前向聲明。那麼當你需要使用它們時,在C的實現文件中包含A和B的頭文件。
記住,U只能在C類的聲明
在你的頭文件使用未來建設:
#ifndef MYCLASS_HPP__20120410__0747
#define MYCLASS_HPP__20120410__0747
// Your definions of class, struct, etc...
#endif//
和所有包含文件(除自Myclass.hpp)應該在類的頭文件Myclass.hpp。他必須包含在Myclass.cpp文件中。
您首先打破循環依賴關係。對於類似的問題,請參閱[此SO回答](http://stackoverflow.com/q/4110479/960195)。 – 2012-04-10 03:12:52
你是什麼意思,「什麼是頂部,不知道什麼在底部?」頭文件中的 – cloudygoose 2012-04-10 03:17:06
表示按照該順序聲明:class A,B C。 A仍然需要知道B或C,但是因爲它在頂部,所以不能使用它們。如果這是有道理的。 – dajee 2012-04-10 03:18:33