假设声明两个类A和B,如果需要在A.h中定义B类对象,B b_; 势必要包含# include "B.h",而B类中需要定义A类对象A a_; 也要包含B.h,但是相互包含是不允许的,称为环形引用,这时候就用到了前向声明。
在B类中进行前向声明:
- class A;
B.h中就不用包含A.h,但是前提是,不能定义对象,只能定义指针或引用。
A类
- //A.h
- # ifndef _A_H_
- # define _A_H_
- # include "B.h"
- class A
- {
- A(void);
- ~A(void);
- B b_; //要包含B.h
- };
- # endif //_A_H
B.h
- //B.h
- # ifndef _B_H_
- # define _B_H_
- //前向声明,不能实例化对象
- class A; // 就不需要包含A.h,要求不能定义对象,只能给定义指针和引用
- //因为我们不知道类长声明样子,就无法为其分配内存
- class B
- {
- B(void);
- ~B(void);
- void fun(A& a)//只能是指针或引用
- {
- ;
- }
- //前向声明的类不能实例化对象
- A* a_; //
- };
- # endif //_B_H_
B.cpp
- B.cpp
- # include "B.h"
- # include "A.h"
- B::B(void)
- {
- }
- B::~B()
- {
- }
总结:
前向声明的类不能实例化对象。