2012-05-06 47 views
5

我很清楚什麼時候可以/不能使用前向聲明,但我仍然不確定一件事情。前向聲明/何時最好包含頭文件?

比方說,我知道我必須包括一個頭遲早要取消引用類A. 的對象我不是它是否更有效地做這樣的事情清楚..

class A; 
class B 
{ 
    A* a; 
    void DoSomethingWithA(); 
}; 

然後在CPP有類似..

#include "A.hpp" 
void B::DoSomethingWithA() 
{ 
    a->FunctionOfA(); 
} 

或者可能我也僅僅包括A在B的頭文件頭擺在首位? 如果前者更高效,那麼我會很感激,如果有人清楚地解釋了爲什麼,因爲我懷疑它與編譯過程有關,我可以隨時瞭解更多信息。

回答

11

使用前聲明(如你的例子),只要有可能。這樣可以減少編譯時間,但更重要的是,可以儘量減少不需要知道且不關心實現細節的代碼的頭和庫依賴性。一般來說,除了實際的實現之外,其他代碼都不應該關心實現細節。

下面是對這個谷歌的理由:Header File Dependencies

+0

+1谷歌C++風格指南 – LihO

+0

歡呼回答,和谷歌的風格指南看起來這將是一個偉大的閱讀感謝! – Holly

+8

我知道這個帖子已經過時了,但我想我應該指出,爲防萬一別人在尋找理由,Google的理由似乎已經變成了「避免在可能的情況下使用前向聲明,只需#include你需要的頭文件。 「 – soulsabr

0

不要試圖讓你的彙編高效。有龍。只需在B.hpp中包含A.hpp即可。

標準做法C和C++頭文件是包裝所有的頭文件的#ifdef來確保它被編譯只有一次:

#ifdef _A_HPP_ 
#define _A_HPP_ 

// all your definitions 

#endif 

這樣,如果在B.hpp#include "A.hpp",你可以有一個包含兩者的程序,並且它不會因爲它不會嘗試定義任何兩次而中斷。

4

當您使用前置聲明,您明確說與它「B類並不需要了解內部實現A類的話,只需要知道類名爲A存在」如果您可以避免包含該標題,則避免使用該標題。 - 使用前向聲明是一種很好的做法,因爲通過使用它可以消除多餘的依賴關係。

另請注意,當您更改頭文件時,會導致包含它的所有文件重新編譯。

這些問題也將幫助你:
What are the drawbacks of forward declaration?
What is the purpose of forward declaration?