c++两个类相互调用

有可能会碰到两个类之间的相互调用的问题,例如:定义了类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 = 1;
    void funA();
};
//b.h
#pragma once
#include<iostream>

class A;
class B {
public:
    int b = 5;
    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 0;
}

运行结果:

或者:

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


class B {
    A a;
};
原文地址:https://www.cnblogs.com/Joezzz/p/10450701.html