[英]Evading including headers to the .h file
有人告诉我,如果可以回避的话,请勿在.header中包含太多类,而应在.cpp中包含它们。 为此,他们告诉我创建原型类,例如:
class abc;
代替:
include "abc.h"
但这只是在abc类未用作属性或返回值的情况下。 如果是参数,我可以使用原型...为什么?
另外,为什么在.h文件中包含如此多的标头如此糟糕?
谢谢
当您向前声明课程时:
class abc;
是成为不完整类型 ,并且您只能对不完整类型做某些事情。 例如,任何需要了解班级成员,甚至需要了解班级规模的知识,都需要完整的声明。
至于包括其他标头中的标头,我可以想到以下两个参数:
根据项目的大小,编译器,硬件等的不同,第一个可能相关,也可能不相关。第二个也有问题,因为它并没有真正减少类之间的依赖关系。
必须使用前向声明的一种情况是,在不同标头中定义的两个类之间具有循环依赖关系。
如果是参数,我可以使用原型...为什么?
每当不需要访问已声明类的内部结构时,例如在声明指针,引用或将其作为参数传递时,都可以使用前向声明。 您不能使用前向声明来继承类,调用其任何成员函数或访问其成员或声明非指针/引用类型的成员:这是因为编译器必须知道该类的内部结构才能执行以上任何操作。
为什么在.h文件中包含这么多标头如此糟糕?
这本身并不普遍“不好”,但是对于许多编译器而言,这可能会减慢编译过程,因此通常将包含的内容减至最少。 现代编译器具有有用的功能(例如预编译的标头)以最大程度地减少影响,因此使用前向声明可以使您在实际操作中比实际问题更具美感。
class abc;
当您向前声明一个类型时,编译器会将其视为Incomeplete类型,并且它不具有有关该类型的内存布局/组成的任何信息。 因此,您不能要求编译器执行任何需要其了解此信息的操作。
使用不完整类型,您不能:
但是使用不完整类型,您可以:
为什么在.h文件中包含这么多标头如此糟糕?
不好是因为:
包括许多标头很不好,因为如果您更改其中的一个标头,那么您也必须编译文件,这听起来似乎不是问题,但是对于大型程序,编译+链接可能会花费很多时间(有时数小时)
在需要生成代码之前,编译器只需要知道名称(而不是组成部分)即可。
因此,前进声明是必经之路-因为它不需要加载和解析。
顺便说一句-它有助于使makefile不必开始重新编译内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.