C++ 包括.h文件

C++ 包括.h文件,c++,coding-style,C++,Coding Style,假设我有两个.h文件:A.h和B.h。 此外,A.h包括B.h本身: B.h-定义B类 class B { ... }; #include B.h class A { void SomeFunction(const B& b); }; A.h-定义A类,使用B类 class B { ... }; #include B.h class A { void SomeFunction(const B& b); }; 现在,我有一些使用A和B类的.cpp文件(B

假设我有两个.h文件:A.h和B.h。 此外,A.h包括B.h本身:

B.h-定义B类

class B {
  ...
};
#include B.h

class A {
  void SomeFunction(const B& b);
};
A.h-定义A类,使用B类

class B {
  ...
};
#include B.h

class A {
  void SomeFunction(const B& b);
};
现在,我有一些使用A和B类的.cpp文件(B类可能不仅在A::SomeFunction(B)中使用)


从设计模式和编码风格的角度来看,包括A.h和B.h(而不仅仅是A.h)有什么好处。

这与设计模式无关。无论何时需要使用类B,您都会包含B.h,无论何时需要使用类A,您都会包含A.h。如果类B是类A的设计细节,或与之密切相关,请将其放在A.h中,而不是放在单独的头文件中。

同时包含“A.h”和“B.h”会使依赖关系完全清楚。“A.h”没有理由不能正向声明类B,因此如果将可传递的include更改为正向声明,则包含这两个头可以防止“.cpp”文件中断。一般来说,依赖可传递包含不是一个好主意,相反,应该显式地包含所有直接依赖项。(请注意,这不适用于旨在提供可传递包含的“主包含”标题)。

我想指出,当您有头文件时,您应该有一个define,以确保它不会包含两次

例如:

A.h:

B.h:


我认为上述内容最有意义,因为现在您可以根据需要多次包含A和B,但不会多次编译。

我很高兴我不是唯一一个被随机使用design patterns标签的人惹恼的人,因为酷孩子也会使用它。如果您只使用B的引用或指针,你不必包含B.h——你可以转发声明B。@sepp2K仅仅因为你可以做某事并不意味着你应该这样做。在我的书中,只有引用或指针并不构成使用类。对Matti:我错了,这不仅仅是因为等。Sepp2k,是的,我知道这一点,我认为我使用某人的LIB,不能改变它。C++中的用户代码中的头标识符是非法的。它们是为实现而保留的。注意:使用防护罩是必要的。