在任何头文件中只定义一个类,而不包括包含此类的整个头文件的目的是什么?



在任何头文件中只定义一个类,而不包括包含此类的整个头文件的目的是什么?

例如,我发现在一些头文件中有一些类声明,如:

#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等,或者任何不需要、不希望、甚至可能不可能解引用的上下文中。

最新更新