两个原则
- 第一个原则是,如果使用的仅仅是一个类的指针或者引用,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。
- 第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非在声明部分(H文件)包含。
类的前向声明带来的问题【has incomplete type】
1.在使用前向声明的类 或者 结构体的时候,只能用作指针或者引用。如果直接定义实例,是编译无法通过的。因为此时,编译器不知道类的具体定义(类内部的成员等),无法构造实例对象。
2.在头文件使用某一自定义的类的指针或引用时,只需要前置声明该类即可,然而如果该类中有静态成员时,必须包含该类的头文件,而不是使用前置声明.