12.1.4 类声明与类定义
在一个给定的源文件中,一个类只能被定义一次。如果在多个文件中定义一个类,那么每个文件中的定义必须是完全相同的。
将类定义放在头文件中,可以保证在每个使用类的文件中以同样的方式定义类。使用头文件保护符(header guard),来保证即使头文件在同一文件中被包含多次,类定义也只出现一次。
可以声明一个类而不定义它:
class Screen;
这个声明,有时称为前向声明(forward declaration),在程序中引入了类类型的Screen。在声明之后、定义之前,类screen是一个不完全类型(incompete type),即已知screen是一个类型,但不知道包含哪些成员。
不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。
在创建类的对象之前,必须完整地定义该类。必须定义类,而不只是声明类,这样,编译器就会给类的对象预订相应的存储空间。同样地,在使用引用或指针访问类的成员之前,必须已经定义类。
为类的成员使用类声明
只有当类定义已经在前面出现过,数据成员才能被指定为该类类型。如果该类型是不完全类型,那么数据成员只能是指向该类类型的指针或引用。
因为只用当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类型一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用。
类的前向声明一般用来编写相互依赖的类。
class Class1
{
public:
Class1 *class1;
Class1 &class2;
};