在任何头文件中只定义一个类而不包括包含这样一个类的整个头文件的目的是什么?
例如,我在一些标题中发现了一些类声明,例如:
#include "blabla.h"
#include "mehmeh.h"
class myClass;
/*
Some code using myClass
*/
使用这种声明的目的是什么?
在任何头文件中只定义一个类而不包括包含这样一个类的整个头文件的目的是什么?
例如,我在一些标题中发现了一些类声明,例如:
#include "blabla.h"
#include "mehmeh.h"
class myClass;
/*
Some code using myClass
*/
使用这种声明的目的是什么?
它被称为前向声明它让您告诉编译器有一个具有该名称的类型,但头文件不需要知道有关该类型的详细信息。
这减少了头文件中的包含并减少了编译时间。
这是一个类的前向声明。它允许您定义对您定义的类的指针和引用,而无需引入整个定义。
这样做的最重要原因是由于循环引用而无法以任何其他方式执行此操作:
class Parent;
class Child {
Parent *parent; // Child must reference Parent
string name;
};
class Parent {
Child *children[32]; // Parent must reference Children
};
另一个原因是加快编译速度:仅仅为了声明一个指针而包含一个大标题可能会大大减慢编译速度。
ISO/IEC 14882, 1st, 3.9.6:“已声明但未定义的类,或未知大小或不完整元素类型的数组,是不完整定义的对象类型。......未完全定义的对象类型的实例是未知的。”
K&R 第 2 期,第 212 页:“类型不完整的对象……可能会在不需要其 [具体] 大小的上下文中提及。”
对于不透明指针、柴郡猫、pimpl 等,或者实际上任何不需要、不需要或什至不可能取消引用的上下文都很有用。