在任何头文件中只定义一个类而不包含包含这样一个类的整个头文件的目的是什么?
例如,我在一些标题中发现在那里有一些类声明,如:
#include "blabla.h"
#include "mehmeh.h"
class myClass;
/*
Some code using myClass
*/
使用此类声明的目的是什么?
答案 0 :(得分:4)
它被称为forward declaration它允许您告诉编译器存在具有该名称的类型,但头文件不需要知道该类型的详细信息。
这会减少标头中的包含并缩短编译时间。
答案 1 :(得分:2)
这是一个类的前向声明。它允许您定义指向您定义的类的指针和引用,而无需提取整个定义。
这样做的最重要原因是,由于循环引用,您无法以任何其他方式执行此操作:
class Parent;
class Child {
Parent *parent; // Child must reference Parent
string name;
};
class Parent {
Child *children[32]; // Parent must reference Children
};
另一个原因是加速编译:包括一个大的头只是为了声明一个指针可能会大大减慢编译速度。
答案 2 :(得分:1)
ISO / IEC 14882,1st,3.9.6:“已声明但未定义的类,或未知大小或不完整元素类型的数组,是未完全定义的对象类型。...大小和未完全定义的对象类型的实例的布局是未知的。“
K& R 2nd,p212:“不完整类型的物体......可能会在不需要[具体]尺寸的情况下提及。”
对于不透明指针,Cheshire Cat,pimpl等有用,或者实际上任何不需要,不需要或甚至不可能解除引用的上下文。