C 中基礎類互相引用帶來的問題

2021-03-31 08:57:00 字數 1392 閱讀 3680

在一些大的工程中,可能會包含幾十個基礎類,免不了之間會互相引用(不滿足繼承關係,而是組合關係)。也就是需要互相宣告。好了,這時候會帶來一些混亂。如果處理得不好,會搞得一團糟,根據我的經驗,簡單談談自已的處理辦法:

編碼時,我們一般會盡量避免include標頭檔案,而是採用宣告 class ***。

但有時候還是必須用include標頭檔案,那麼,兩者的劃分在於什麼呢?

應該是很明確的,但書上好像都少有提及。

首先:我們要明白為什麼要用宣告取代標頭檔案包含:對了,是為了避免無必要的重編譯(在標頭檔案發生變更時)。

工程較大,低速機,或基礎類經常變更(不合理的設計吧),編譯速度還是會在意的,

另外,更為重要的是,採用宣告可降低**(class)之間的藕合度,這也是物件導向設計的一大原則。

二:一般原則:

a. 標頭檔案中盡量少include, 如果可以簡單申明 class clsold; 解決,那最好。減少沒有必要的include,

b. 實現檔案中也要盡量少include,不要include沒有用到的標頭檔案。

三:那什麼時候可以只是簡單宣告class clsold呢?

簡單的說:不需要知道clsold的記憶體布局的用法都可以(靜態成員除外),也就是講如果是指標或引用方式

的都行。

比如:clsold * m_pold;    //指標佔4個位元組長

clsold & test(clsold * pold) ;

一切ok。

四:什麼時候不能簡單宣告class clsold,必須include呢?

不滿足三的情況下:

比如:clsold m_objold;  //不知道佔據大小,必須要通過它的具體宣告來計算

原因很簡單,想想你要計算sizeof(classnew),但連clsold的size都不知道,編譯器顯然會無能為力。

特殊情況:

int test()

靜態成員呼叫,想來應該是不需要知道記憶體布局的,但因為需要知道m_sint是屬於clsold命名空

間的,如果只宣告class ***顯然是不足以說明的,所以必須包含標頭檔案。

綜上所述,我有以下幾點建議:

1:如果有共同相關依賴(必須include)的類,比如 a,b都依賴d 可以放在一起,然後直接 include "d"

類的使用者只需關心與本類暴露出的相關型別,內部用到的型別不用去管(不用自已去include d)。這樣

給出的class,呼叫者才更好用(不用去看**查詢,是不是還需要包含其它標頭檔案)。

2:如果a類依賴d b類不依賴d,可以把它們分開兩個標頭檔案。各自include。這樣可避免當d發生變化時,

避免不必要重編譯。

3:類中盡量採用指標或引用方式呼叫其它類,這樣就可以只宣告class ***了。並且這也符合資源最優

利用,更利於使用多型。

c 中兩個類互相引用的問題

最近在改乙個c 程式的時候碰到一條警告資訊,警告資訊為 刪除指向不完整 q2dtorusnode 型別的指標 沒有呼叫析構函式 1 c users lxw desktop dragonfly第二階段實驗 最終的實驗版本 實驗目錄 dragonfly modify src q2dtorus.h 6 參...

c 中兩個類互相引用的問題

最近在改乙個c 程式的時候碰到一條警告資訊,警告資訊為 刪除指向不完整 q2dtorusnode 型別的指標 沒有呼叫析構函式 1 c users lxw desktop dragonfly第二階段實驗 最終的實驗版本 實驗目錄 dragonfly modify src q2dtorus.h 6 參...

c 兩個類互相引用的問題

現在有兩個類要相互應用時,會出現各種各樣的問題,首先看第乙個例子 ifndef ah define ah class b class a a endif標頭檔案a.h包含class a如上 ifndef bh define bh class b endif標頭檔案b.h包含classb 此時編譯就會...