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