c++两个类相互调用

时间:2022-04-14 14:46:20

有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型

class A {
B b;
}; class B {
A a;
};

  编译器在声明A的时候,由于B的声明在A的下面所以出现编译错误

那么,在定义时如果要相互调用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的:

//a.h
#include"b.h"
class A {
public:
B xianghuInA;
}; //b.h
#include"a.h"
class B {
public:
A xianghuInB;
};

怎么办?一般的做法是

1)class B采用前置声明的方式声明class A

2)在class B中只能声明class A类型的指针,因为定义指针时不需要对那个类的定义可见

3)在class A的头文件中包含class B 的头文件

//a.h
#pragma once
#include"b.h" //一定要有
class A {
public:
B xianghuInA;
int a = ;
void funA();
};
//b.h
#pragma once
#include<iostream> class A;
class B {
public:
int b = ;
A* xianghuInB = NULL; //一定要是指针
void funB();
~B();
};
//a.cpp
#include"a.h"
#include<iostream>
using namespace std; void A::funA()
{
cout << xianghuInA.b << endl;
}
//b.cpp
#include"b.h"
#include<iostream>
#include <typeinfo>
using namespace std; void B::funB()
{
cout << typeid(xianghuInB).name() << endl;
} B::~B() {
delete xianghuInB;
}
//main.cpp
#include<iostream>
#include"a.h"
#include"b.h"
using namespace std; int main()
{
A qq;
qq.funA();
B hh;
hh.funB();
return ;
}

运行结果:

c++两个类相互调用

或者:

//main.cpp
class B;
class A {
B* b;
}; class B {
A a;
};