在任何头文件中只定义一个类,而不包括包含此类的整个头文件的目的是什么?
例如,我发现在一些头文件中有一些类声明,如:
#include "blabla.h"
#include "mehmeh.h"
class myClass;
/*
Some code using myClass
*/
使用这种声明的目的是什么?
这被称为前向声明,它可以让你告诉编译器有一个具有该名称的类型,但头文件不需要知道该类型的详细信息。
这样可以减少头文件中的include,减少编译时间。
这是一个类的前向声明。它允许您定义指向所定义的类的指针和引用,而无需拉入整个定义。
这样做的最重要的原因是,由于循环引用,您无法通过其他方式实现:
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, p212: "具有不完全类型的对象…可以在不需要其[混凝土]尺寸的上下文中提到。"
适用于不透明指针、Cheshire Cat、pimpl等,或者任何不需要、不希望、甚至可能不可能解引用的上下文中。