2013-03-21 74 views
1

我已被告知不包括在.header太多的课,如果我能回避它,而是,包括它们在.cpp。要做到这一点,他们告诉我创建原型类,如:偷税包括标题到.h文件

class abc; 

代替:

include "abc.h" 

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

另外,为什么是如此糟糕,包括在.h文件中这么多的头?

感谢

回答

2

如果它是一个参数,我可以使用的原型......这是为什么呢?

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

为什么这么差,包括在.h文件中这么多的头?

这本身并不是普遍的“坏”,但是对于许多编译器来说,它可能会减慢编译过程,所以通常最小化包含。现代编译器具有有用的功能(如预编译头文件)以最大限度地减少影响,因此使用前向声明可以使您变得更加美观而不是实际问题。

+0

预编译头做帮助,但不解决的,需要的代码库的主要部分,如果其中一个标题被修改不必要地重新编译大型依存关系树的问题。使用预编译头文件只需加快重建速度,但不会阻止它。 – 2013-03-21 11:49:30

+0

好吧,但是,如果原型类被用作属性,我不能使用原型,我必须做include,或者至少是我被告知的。为什么? – Frion3L 2013-03-21 12:07:38

+0

@ Frion3L如果使用前向声明的'class Foo'作为属性,则有三个选项:使其成为指针'Foo * attr',引用'Foo&attr'或值'Foo attr'。这只是第三种情况,因为编译器需要知道'Foo'的结构,以便计算其中'Foo attr'是属性的类的大小。 – dasblinkenlight 2013-03-21 13:40:42

2

当你向前声明一个类:

class abc; 

是成为incomplete type,而且也只有某些东西,你可以用一个不完整的类型做。例如,任何需要了解班级成员的知识,甚至是对其规模的了解,都需要一个完整的声明。

至于包括来自其他头头,我能想到的对两个参数:

  1. 改进生成时间。
  2. 更少的依赖性。

第一种可能或不可能根据项目的大小有关,你的编译器,硬件等。第二个也值得怀疑,因为它并没有真正减少类之间的依赖关系。

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

1
class abc; 

当向前声明一个类型的编译器将其视为Incomeplete型和它不具有有关此类型的存储器布局/组合物的任何信息。所以你不能要求编译器执行任何要求它知道这些信息的操作。

一种不完全类型不能:

  • 用它来声明一个成员。
  • 定义使用此类型的函数或方法。

但不完整的类型,您可以:

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

为什么这么差,包括在.h文件中这么多的头?

这是不好的,因为:

  • 包括头仅仅是标题的内容复制粘贴到当前翻译单元。这增加了编译时间以及构建依赖关系。
0

这是不好的,包括许多头,因为如果你改变了其中的一个,你必须编译文件为好,这听起来或许不是一个问题,但对于大型程序编译+链接会花费大量的时间(有时小时)

0

所有编译器在需要生成代码之前需要知道的是名称而不是组合。

所以前置声明是要走的路 - 因为它不需要加载和解析。

顺便说一句 - 它有助于生成文件没有启动重新编译的东西。