1. 程式人生 > 其它 >C++類相互包含

C++類相互包含

1. 兩個類需要相互包含的情景

在觀察者模式中,氣象站的資料送給某些布告牌。

氣象站要知道通知哪些布告牌,所以氣象站類至少有一個布告牌型別的連結串列。

布告牌需要把自己註冊到氣象站類,告訴氣象站類自己已經訂閱訊息,

註冊函式需要氣象站類作為形參,才知道自己註冊到哪一個氣象站。

也就是說,在類定義的時候,他們就是需要對方的!

所以,我需要在各自類定義的標頭檔案中,include對方類所在的標頭檔案?錯誤!

具體錯誤型別是:語法錯誤(識別符號)。

2.類(和結構體)是不能相互包含的

類在定義的時候需要知道類的大小,例項化的時候才可以正確分配空間。

假如類A正常定義,類B中有類A,這也是OK的,因為類A大小已知,類B大小也就已知了。

假如A中有B,B中有A呢?A和B都不確定大小,好像進入了一個類似死鎖的情景。

A和B都不知道自己例項化物件的時候到底申請多少空間。

同樣結構體也是一樣,是不可以相互包含的!

3. 如何解決需要相互包含的情景?

①儘量使用指標來解決問題

既然是因為大小不確定,導致的類定義錯誤,那就使用類的指標來替代類好了,使用起來沒有什麼區別!

在Linux核心中,結構體特別多,肯定會出現相互包含的情況吧,所以Linux核心中儘量採用結構體指標。

以後我們也儘量使用結構體指標,通過pStruct->fun()來呼叫方法。

②宣告類,而不是包含標頭檔案!

類是在標頭檔案中定義的,類在定義的時候需要包含其他類,所以需要在標頭檔案中包含其他標頭檔案。

思考一下標頭檔案相互include,會出現什麼情況?

include就是拷貝的意思,互相include,不就是無限制的拷貝下去嗎?

所以標頭檔案的相互包含中也不支援。

有什麼解決方法呢?宣告類取代include定義:class A;

原來不知道,類也是可以宣告的!

③如何呼叫宣告類的成員函式?

在定義類B的標頭檔案中,聲明瞭類A,那麼類B中如何呼叫A.fun()?

編譯器又不知道A中有哪些成員函式,宣告只是告訴有這個類,不提供其他資訊。

所以,不要在類的定義標頭檔案中,使用其他類的方法。

在哪裡可以使用其他類的方法?在本類的成員函式的實現的cpp檔案中可以!

4.總結的幾條重要結論!!!

①在類B的定義標頭檔案中(B.h)不要include其他標頭檔案(A.h)!

②在某個類的定義標頭檔案中(B.h)需要其他類(A.h),使用類的宣告(class A;)!

③儘量使用類/結構體指標替