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;)!
③盡量使用類/結構體指針替代對象!
④在某個類的定義頭文件中(B.h),不應該調用其他類的方法(A.fun())!
⑤因為要在類B的成員函數的實現c文件中(B.cpp),才會開始調用A的成員函數(A.fun()),
這個時候在B.cpp中包含include “A.h”就不會出問題了!
參考: