简化问题为:我们现在有A,B两个类的头文件,具体有A.h,A.cpp,B.h,B.cpp个文件夹。假如在A类中我们需要使用B类,在B类中需要使用A类,常规操作就是相互引用各自的头文件。但是这样会造成循环依赖的情况,就会报错。
1.前向声明解决互相引用造成循环依赖
//A.h
#pragma once
#include "B.h"
class A
{
public:
A();
~A();
private:
B* b;
};
//B.h
#pragma once
//前向声明取代互相引用头文件
class A;
class B
{
public:
B();
~B();
private:
A* a;
};
注意:只能用于定义指针、引用、以及用于函数形参的指针和引用。而不能定义对象(因为此时编译器只知道这是个类,还不知道这个类的大小有多大),也不能访问类的对象,任何形式的访问都不允许。
2.使用前向声明取代引用的这个类,在以下情况会报错:
//A.h
#pragma once
#include "B.h"
class A
{
public:
A();
~A();
int a_;
private:
B* Cls_B_;
};
//B.h
#pragma once
class A;
class B
{
public:
B();
~B();
void BCallA(A* a);
private:
A* Cls_A_;
};
//B.cpp
#include "B.h"
//#include "A.h” 反注释解决找不到A定义的报错
B::B(void){
};
B::~B(void){
};
void B::BCallA(A* a){
int tmp = a->a_;
return ;
}
原因也比较简单,是因为B类由于前向声明没有#include “A.h”,导致找不到A类的定义,解决方案就是在B.cpp中#include "A.h"一下即可。