我被告知不要在.header中包含太多类,如果我可以避开它,而是将它们包含在.cpp中。为此,他们告诉我创建原型类,如:
class abc;
而不是:
include "abc.h"
但这只是为了防止abc类被用作属性或返回值。如果它是一个参数,我可以使用原型......这是为什么?
另外,为什么在.h文件中包含这么多标题真是太糟糕了?
由于
答案 0 :(得分:2)
当你转发声明一个类时:
class abc;
变为incomplete type,并且只有某些事情可以使用不完整的类型。例如,任何需要了解班级成员的知识,甚至是大小知识,都需要完整的声明。
至于包含来自其他标题的标题,我可以想到两个参数:
第一个可能相关也可能不相关,具体取决于项目的大小,编译器,硬件等。第二个也有问题,因为它并没有真正减少类之间的依赖关系。
使用转发声明的一种情况是,在不同标头中定义的两个类之间存在循环依赖关系。
答案 1 :(得分:2)
如果是参数,我可以使用原型......为什么会这样?
只要您不需要访问声明的类的内部结构,就可以使用前向声明,例如:当您声明指针,引用或将其作为参数传递时。您不能使用前向声明来继承类,调用其任何成员函数或访问其成员,或声明非指针/引用类型的成员:这是因为编译器必须知道类的内部结构才能做以上任何一项。
为什么在.h文件中包含这么多标题真是太糟糕了?
这本身并不普遍“坏”,但是对于许多编译器来说,它可能会减慢编译过程,因此通常会最小化包含。现代编译器具有有用的功能(例如预编译头文件)以最小化影响,因此使用前向声明,您可以成为一种美学选择,而不是实际问题。
答案 2 :(得分:1)
class abc;
当您转发声明类型时,编译器将其视为 Incomeplete类型,并且它没有关于该类型的内存布局/组成的任何信息。因此,您无法要求编译器执行任何需要它来了解此信息的操作。
对于不完整类型,您不能:
但使用不完整类型,您可以:
为什么在.h文件中包含这么多标题真是太糟糕了?
这很糟糕,因为:
答案 3 :(得分:0)
包含许多标题是不好的,因为如果你改变其中一个标题你也必须编译你的文件,这可能听起来不像是一个问题,但对于大型程序编译+链接可能需要花费很多时间(某些时间)< / p>
答案 4 :(得分:0)
所有编译器需要知道的是名称 - 而不是组合 - 直到它需要生成代码。
因此,前向声明是可行的方法 - 因为它不需要加载和解析。
BTW - makefile不必重新编译东西就有帮助。