我已被告知不包括在.header太多的课,如果我能回避它,而是,包括它们在.cpp。要做到这一点,他们告诉我创建原型类,如:偷税包括标题到.h文件
class abc;
代替:
include "abc.h"
但这只是万一ABC类不被用作属性或返回值。如果它是一个参数,我可以使用原型...这是为什么?
另外,为什么是如此糟糕,包括在.h文件中这么多的头?
感谢
我已被告知不包括在.header太多的课,如果我能回避它,而是,包括它们在.cpp。要做到这一点,他们告诉我创建原型类,如:偷税包括标题到.h文件
class abc;
代替:
include "abc.h"
但这只是万一ABC类不被用作属性或返回值。如果它是一个参数,我可以使用原型...这是为什么?
另外,为什么是如此糟糕,包括在.h文件中这么多的头?
感谢
如果它是一个参数,我可以使用的原型......这是为什么呢?
只要哟不需要访问已声明类的内部结构,您就可以使用前向声明,例如,当你声明一个指针,一个引用或者将它作为参数传递时。您不能使用前向声明来继承类,调用其任何成员函数或访问其成员,或者声明非指针/引用类型的成员:这是因为类的内部结构必须为编译器所知做任何以上。
为什么这么差,包括在.h文件中这么多的头?
这本身并不是普遍的“坏”,但是对于许多编译器来说,它可能会减慢编译过程,所以通常最小化包含。现代编译器具有有用的功能(如预编译头文件)以最大限度地减少影响,因此使用前向声明可以使您变得更加美观而不是实际问题。
当你向前声明一个类:
class abc;
是成为incomplete type,而且也只有某些东西,你可以用一个不完整的类型做。例如,任何需要了解班级成员的知识,甚至是对其规模的了解,都需要一个完整的声明。
至于包括来自其他头头,我能想到的对两个参数:
第一种可能或不可能根据项目的大小有关,你的编译器,硬件等。第二个也值得怀疑,因为它并没有真正减少类之间的依赖关系。
使用前向声明时的一种情况是,当您在不同标头中定义的两个类之间存在循环依赖关系时。
class abc;
当向前声明一个类型的编译器将其视为Incomeplete型和它不具有有关此类型的存储器布局/组合物的任何信息。所以你不能要求编译器执行任何要求它知道这些信息的操作。
一种不完全类型不能:
但不完整的类型,您可以:
为什么这么差,包括在.h文件中这么多的头?
这是不好的,因为:
这是不好的,包括许多头,因为如果你改变了其中的一个,你必须编译文件为好,这听起来或许不是一个问题,但对于大型程序编译+链接会花费大量的时间(有时小时)
所有编译器在需要生成代码之前需要知道的是名称而不是组合。
所以前置声明是要走的路 - 因为它不需要加载和解析。
顺便说一句 - 它有助于生成文件没有启动重新编译的东西。
预编译头做帮助,但不解决的,需要的代码库的主要部分,如果其中一个标题被修改不必要地重新编译大型依存关系树的问题。使用预编译头文件只需加快重建速度,但不会阻止它。 – 2013-03-21 11:49:30
好吧,但是,如果原型类被用作属性,我不能使用原型,我必须做include,或者至少是我被告知的。为什么? – Frion3L 2013-03-21 12:07:38
@ Frion3L如果使用前向声明的'class Foo'作为属性,则有三个选项:使其成为指针'Foo * attr',引用'Foo&attr'或值'Foo attr'。这只是第三种情况,因为编译器需要知道'Foo'的结构,以便计算其中'Foo attr'是属性的类的大小。 – dasblinkenlight 2013-03-21 13:40:42