2010-05-18 140 views
2

假設我有兩個.h文件:A.h和B.h. 此外,阿包括了Bh本身:包括.h文件

了Bh - 定義類B.

class B { 
    ... 
}; 

- 定義A類,其使用類B.

#include B.h 

class A { 
    void SomeFunction(const B& b); 
}; 

現在,我有一些.cpp文件,它使用A和B類(B類可能不僅用於A :: SomeFunction(B))

從設計模式和編碼風格的角度來看,包括A.h和B.h(而不僅僅是A.h)的優勢是什麼。

回答

6

包括「A.h」和「B.h」使得依賴完全清晰。沒有理由說明爲什麼「A.h」不能有前向聲明的類B,因此如果包含這兩個頭文件的話,在傳遞包含被改爲前向聲明時,可以防止你的「.cpp」文件被破壞。總的來說,依賴傳遞包含並不是一個好主意,而是應該明確包含所有的直接依賴。 (請注意,這不適用於旨在給出傳遞包含的「主包含」標頭)。

+1

這個答案很好,因爲任何使得依賴關係更清晰的東西都會被鼓掌稱讚。 N.B:包括衛兵的使用是必要的。 – Johnsyweb 2010-05-18 11:55:21

3

這與設計模式無關。只要你需要使用B類,你就可以包含Bh,並且當你需要使用A類時,你將包括Ah。如果B類是A類的設計細節,或者與A緊密相關,將它放在Ah而不是在單獨的頭文件中。

+1

我很高興我不是唯一一個被隨意使用設計模式標籤的人所厭煩,因爲很酷的孩子也使用它。 – 2010-05-18 09:34:22

+1

如果您只使用引用或指向B的引用或指針,則不一定必須包含B.h - 您可以只是前進 - 聲明B. – sepp2k 2010-05-18 09:34:42

+0

@ sepp2K僅僅因爲您可以做某件事並不意味着您應該這樣做。只有引用或指針腳趾纔不會在我的書中使用類。尼爾·巴特沃斯: – 2010-05-18 09:37:31

0

我想指出,當你有頭文件,你應該有一個定義,以確保它不包括兩次。

例如:

啊:

#ifndef _A_H_ 
#define _A_H_ 

class A 
{ 
}; 

#endif 

了Bh:

#ifndef _B_H_ 
#define _B_H_ 

#include "a.h" 

class B : public A 
{ 
}; 

#endif 

我覺得上面是很有道理的,因爲現在你可以包含A和B作爲多次,你認爲你需要,但不會多次編譯。

+1

這些頭文件保護名在C++用戶代碼中是非法的 - 它們被保留用於實現。 – 2010-05-18 11:43:21