2012-04-10 274 views
0

所以,我在這裏一個問題:C++包含頭文件

類A需要知道B類,B類需要知道C和C類需要知道A. 它本質一個圓圈,所以我得到了定義錯誤。我嘗試了向前的聲明,但無論頂部,還是不知道底部還有什麼。

我該如何處理這種情況?

感謝

大衛

+5

您首先打破循環依賴關係。對於類似的問題,請參閱[此SO回答](http://stackoverflow.com/q/4110479/960195)。 – 2012-04-10 03:12:52

+0

你是什麼意思,「什麼是頂部,不知道什麼在底部?」頭文件中的 – cloudygoose 2012-04-10 03:17:06

+0

表示按照該順序聲明:class A,B C。 A仍然需要知道B或C,但是因爲它在頂部,所以不能使用它們。如果這是有道理的。 – dajee 2012-04-10 03:18:33

回答

2

假設這個使用指針是簡單的東西,上面亞當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,這......我希望你明白。但用指針,你可以循環它。隨着組成(不是指針)它不能循環。

0

如果類是緊耦合的,那麼你就可以

  • 做聲明的類沒有方法的實現,可能使用前向聲明,然後實現方法(可能在一個實現文件中)。

否則,您可以

  • 分解出更多的抽象接口(S)足以類在不知道對方的全部細節工作。

但很可能你有一個設計級別的錯誤,如果是這樣,只是解決這個問題。

0

你可以做的是向前聲明A類在C類的頭文件,那麼你在.cpp文件中,你包括A類

頁眉有關如何轉發聲明引用A級,看看這個參考 - Forward declarations in C++

0

最有可能的,我剛剛得到了設計級別的錯誤。然而,如果你必須這樣做,例如,試着通過聲明一個空的類A,B而不用在C的頭文件中提供任何細節實現來利用前向聲明。那麼當你需要使用它們時,在C的實現文件中包含A和B的頭文件。

記住,U只能在C類的聲明

0

在你的頭文件使用未來建設:

#ifndef MYCLASS_HPP__20120410__0747 
#define MYCLASS_HPP__20120410__0747 
// Your definions of class, struct, etc... 
#endif// 

和所有包含文件(除自Myclass.hpp)應該在類的頭文件Myclass.hpp。他必須包含在Myclass.cpp文件中。