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;)!

③盡量使用類/結構體指針替代對象!

④在某個類的定義頭文件中(B.h),不應該調用其他類的方法(A.fun())!

⑤因為要在類B的成員函數的實現c文件中(B.cpp),才會開始調用A的成員函數(A.fun()),

這個時候在B.cpp中包含include “A.h”就不會出問題了!

 

參考:

c語言結構體相互引用

C++中兩個類相互包含引用問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM