避免将标题包含在.h文件中

时间:2013-03-21 11:27:33

标签: c++ prototype header-files

我被告知不要在.header中包含太多类,如果我可以避开它,而是将它们包含在.cpp中。为此,他们告诉我创建原型类,如:

class abc;

而不是:

include "abc.h"

但这只是为了防止abc类被用作属性或返回值。如果它是一个参数,我可以使用原型......这是为什么?

另外,为什么在.h文件中包含这么多标题真是太糟糕了?

由于

5 个答案:

答案 0 :(得分:2)

当你转发声明一个类时:

class abc;

变为incomplete type,并且只有某些事情可以使用不完整的类型。例如,任何需要了解班级成员的知识,甚至是大小知识,都需要完整的声明。

至于包含来自其他标题的标题,我可以想到两个参数:

  1. 改进了构建时间。
  2. 依赖性较低。
  3. 第一个可能相关也可能不相关,具体取决于项目的大小,编译器,硬件等。第二个也有问题,因为它并没有真正减少类之间的依赖关系。

    使用转发声明的一种情况是,在不同标头中定义的两个类之间存在循环依赖关系。

答案 1 :(得分:2)

  

如果是参数,我可以使用原型......为什么会这样?

只要您不需要访问声明的类的内部结构,就可以使用前向声明,例如:当您声明指针,引用或将其作为参数传递时。您不能使用前向声明来继承类,调用其任何成员函数或访问其成员,或声明非指针/引用类型的成员:这是因为编译器必须知道类的内部结构才能做以上任何一项。

  

为什么在.h文件中包含这么多标题真是太糟糕了?

这本身并不普遍“坏”,但是对于许多编译器来说,它可能会减慢编译过程,因此通常会最小化包含。现代编译器具有有用的功能(例如预编译头文件)以最小化影响,因此使用前向声明,您可以成为一种美学选择,而不是实际问题。

答案 2 :(得分:1)

class abc;

当您转发声明类型时,编译器将其视为 Incomeplete类型,并且它没有关于该类型的内存布局/组成的任何信息。因此,您无法要求编译器执行任何需要它来了解此信息的操作。

对于不完整类型,您不能:

  • 用它来宣布成员。
  • 使用此类型定义函数或方法。

但使用不完整类型,您可以:

  • 声明成员是指向不完整类型的指针。
  • 声明接受/返回不完整类型的函数或方法。
  • 定义接受/返回指向不完整类型的指针的函数或方法(但不使用其成员)。
  

为什么在.h文件中包含这么多标题真是太糟糕了?

这很糟糕,因为:

  • 包含标题仅复制将标题的内容粘贴到当前翻译单元。这会增加编译时间并构建依赖关系。

答案 3 :(得分:0)

包含许多标题是不好的,因为如果你改变其中一个标题你也必须编译你的文件,这可能听起来不像是一个问题,但对于大型程序编译+链接可能需要花费很多时间(某些时间)< / p>

答案 4 :(得分:0)

所有编译器需要知道的是名称 - 而不是组合 - 直到它需要生成代码。

因此,前向声明是可行的方法 - 因为它不需要加载和解析。

BTW - makefile不必重新编译东西就有帮助。