C++头文件相互引用解决方案

简化问题为:我们现在有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"一下即可。

猜你喜欢

转载自blog.csdn.net/weixin_42096202/article/details/110423048