2010-05-18 130 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