通过在 A 和 B 类定义(标题)中使用前向声明并在 B.cpp 中包括 Ah 以及在 A.cpp 中包括 Bh 来解决该问题。这是代码:
//A.h
#ifndef A_H_
#define A_H_
#include <iostream>
using namespace std;
class B;
class A{
public:
A();
virtual ~A();
private:
B* pToB;
public:
void doSomething(B* b);
void SetB(B* b);
};
#endif
A 类的 cpp,注意包含 Bh(我通常不会这样做)
// A.cpp
#include "A.h"
#include "B.h"
A::A():pToB(){
cout << "A constructor" << endl;
}
A::~A(){}
void A::SetB(B* b){
this->pToB = b;
cout << "setting B" << endl;
}
void A::doSomething(B* b){
cout << "A is gonna call B's method add: ";
b->add();
}
现在是 B 类:
// B.h
#ifndef B_H_
#define B_H_
#include <iostream>
using namespace std;
class A;
class B{
public:
B();
virtual ~B();
private:
A* pToA;
public:
void add();
void SetA(A* a);
};
#endif
B的实现
// B.cpp
#include "B.h"
#include "A.h"
B::B():pToA(){
cout << "B constructor” << endl;
}
B::~B(){}
void B::SetA(A* a){
this->pToA = a;
cout << "setting A" << endl;
}
void B::add(){
cout << "B is adding" << endl;
}
包括主要功能的 cpp(包括两个标题,不包括)
#include "A.h"
#include "A.h"
int main() {
A* newA = new A;
B* newB = new B;
newA->SetB(newB);
newB->SetA(newA);
newA->doSomething(newB);
return 0;
}
这个程序的输出是这样的:
A constructor
B constructor
setting B
setting A
A is gonna call B's method add: B is adding
感谢Sandeep Datta,他的解决方案帮助我解决了这个问题