类前置声明的使用
今天在寫代碼時,遇到了是否需要加頭文件的問題,看到這個博客之后收益匪淺,因此轉(zhuǎn)載該篇文章。
轉(zhuǎn)載:https://www.jianshu.com/p/9768175387b6
首先我們看這樣一個示例程序:
以上代碼中,類CY中有個CX類型的數(shù)據(jù)成員,我們需要在CY.h中包含CX.h才能編譯通過。所以,我們說這里的CY類依賴CX類,當(dāng)CX.h修改導(dǎo)致CX對象的大小發(fā)生變化時(比如,新增一個數(shù)據(jù)成員或新增一個方法時), CY.cpp都需要重新編譯。這在大型工程中可能會造成巨大的編譯成本.
有沒有辦法解決這個問題? 有!使用類前置聲明。
我們先看看修改之后的代碼。
這里首先將CX.h的包含語句修改為CX的類前置聲明,然后數(shù)據(jù)成員由CX對象修改為指向CX對象的指針。但是奇怪的是,如果不將CX對象修改為指向CX對象的指針,還是會編譯出錯。
error C2079: “CY::m_x2”使用未定義的 class“CX”
只能在指針或引用類型上使用類前置聲明
當(dāng)CY.h中的數(shù)據(jù)成員是CX對象時,CY.h需要知道CX對象的大小,當(dāng)CX.h發(fā)生修改,例如向CX類添加數(shù)據(jù)成員或者方法成員,CX對象大小發(fā)生改變,所以CY.cpp必須重新編譯。
當(dāng)CY.h中的數(shù)據(jù)成員是指向CX對象的指針時,CY.h并不需要知道CX對象的大小,因為指向CX對象的指針在給定平臺上的大小是固定的。所以,只需要一種“非完整性聲明”,也即這里的類前置聲明。
引用的本質(zhì)還是指針,所以類前置聲明也適合引用的情況。
可以使用類前置聲明的幾種情況
1. CY有一個類型為指向CX的指針的成員變量。
2. CY有一個類型為容器成員,且容器類的元素是指向CX的指針。但是如果元素是CX對象的話,則會編譯出錯,原因是CY需要知道CX對象的大小。
3. CY中有一個函數(shù),它的返回值是CX對象/指向CX的指針/指向CX的引用,或者它的參數(shù)是CX對象/指向CX的指針/指向CX的引用。
總結(jié)
合理的使用類前置聲明,不僅可以減少工程編譯的時間,更重要的是,可以讓你從更深的視角洞察工程的物理依賴關(guān)系,從而為代碼重構(gòu)提供依據(jù)。在寫代碼的時候,不妨經(jīng)常問一下自己:我是否真的有必要在這個頭文件里包含另一個頭文件?
?
總結(jié)
- 上一篇: MySQL buffer pool里的三
- 下一篇: 【F2FS LFS SSR】华为如何打造