1. 兩個類須要相互包含的情景html
在觀察者模式中,氣象站的數據送給某些布告牌。函數
氣象站要知道通知哪些布告牌,因此氣象站類至少有一個布告牌類型的鏈表。post
布告牌須要把本身註冊到氣象站類,告訴氣象站類本身已經訂閱消息,url
註冊函數須要氣象站類做爲形參,才知道本身註冊到哪個氣象站。指針
也就是說,在類定義的時候,他們就是須要對方的!htm
因此,我須要在各自類定義的頭文件中,include對方類所在的頭文件?錯誤!對象
具體錯誤類型是:語法錯誤(標識符)。blog
2.類(和結構體)是不能相互包含的get
類在定義的時候須要知道類的大小,實例化的時候才能夠正確分配空間。編譯器
假如類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;)!
③儘可能使用類/結構體指針替代對象!
④在某個類的定義頭文件中(B.h),不該該調用其餘類的方法(A.fun())!
⑤由於要在類B的成員函數的實現c文件中(B.cpp),纔會開始調用A的成員函數(A.fun()),
這個時候在B.cpp中包含include 「A.h」就不會出問題了!
參考: