C 類相互包含

2022-08-21 20:54:14 字數 1575 閱讀 5862

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++中兩個類相互包含引用問題

C 類包含問題 重複包含和相互包含

一.重複包含標頭檔案 標頭檔案重複包含,可能會導致的錯誤包括 變數重定義,型別重定義及其他一些莫名其妙的錯誤。c 提供兩種解決方案,分別是 ifndef和 pragma once ifndef some file h pragma once define some file h 一些宣告語句 一些宣...

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

在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如 定義了類a類b,a中使用了b定義的型別,b中也使用了a定義的型別 class a int i b b class b int i a a 請注意上面的定義內容,一般情況下是不能出現類a,類b相互引用都定義物件,即如下的樣子 class a...

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

在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如 定義了類a類b,a中使用了b定義的型別,b中也使用了a定義的型別 class a class b 請注意上面的定義內容,一般情況下是不能出現類a,類b相互引用都定義物件,即如下的樣子 class a class b 在這種情況下,想想可以...