2010-12-11 142 views
2

大多數情況下,當在一個使用對方的程序中創建多個類時,我只想包含我需要的最少數量的頭文件以減少混亂。我應該包含另一個頭文件中包含的文件嗎?

例如,C類繼承自包含A類的B類。當然,因爲B類包含A類作爲成員,所以它需要在b.h中包含a.h。但是,讓我們假設C還需要包含a.h。作爲我的懶惰,我只包括b.h(C需要包括反正),並且因爲b.h已經包括a.h,我不需要再包括任何東西,它編譯得很好。我的.cpp文件一樣:我只是包含標題,標題中包含的任何內容都會自動包含在我的.cpp文件中,因此我不在其中。

這是我的一個壞習慣嗎?它是否會讓我的代碼不易讀?

回答

4

在不依賴外部包含排序(換句話說:使您的標題自足)的情況下,包含解析頭文件所需的內容。

就你而言,如果c.h宣告class C繼承自class B,顯然你必須包含B.h。但是,如果class A從未出現在c.h中,我相信沒有理由包含它。 b.h提到A這一事實意味着b.h必須通過正向聲明A或包括a.h進行必要的解析。

所以從我的角度來看,你正在做的事情應該做的。

另請注意,如果由於某些原因c.h開始提及A,我會添加適當的包含或前向聲明,所以我不會依賴於b.h爲我做的事實。

6

我堅持這個簡單的規則:包括你需要的所有東西來完全聲明給定的類,但不是更多,並且不要假設包含從其他來源被拉入,即確保你的文件是自給自足的。

2

最好將包含您直接使用的定義的每個標題包含在內。

依賴於其他頭文件之一來包含東西,會使代碼更加脆弱,因爲它依賴於外部類的實現。

編輯:

簡單例子:

  • B類使用類A,例如使用散列機制的散列表實現方式B您創建了需要散列表(即B)和散列算法(即A)用於其他一些目的的類C。你包括B.h並且省略A.h,因爲B.h包括它。

  • 瑪麗,你的一位同事,發現了一篇關於這個新的神話般的哈希算法的論文,它減少了碰撞的可能性,而它需要的空間減少了10%,速度也增加了一倍。她(正確地)重寫類B以使用實現該算法的類D。由於B中不再需要A類,所以她也從B.h.中刪除所有對它的引用。

  • 您的代碼被中斷。

編輯2:

有一些程序員(和我偶爾會犯這樣也着急時)誰由具有「包括所有」頭文件處理這個問題在他們的項目中。這應該避免,因爲它會導致無與倫比的命名空間污染。是的,MSVC中的windows.h是我認爲的其中一種情況。