本文转自 http://blog.csdn.net/xuyuanfan/article/details/10002255
做项目过程中,一般会遇到两个类相互关联的情况,而这两个类又分别放在两个不同文件中,所以就“情不自禁”地相互包含对方的头文件,然后就“理所应当”地编译错误了。在这里,就讲一下如何让位于不同文件的的两个类相互关联。
首先设计类A(包括头文件classA.h和源文件classA.cpp),其中头文件classA.h要#include "classB.h",而源文件classA.cpp又#include"classA.h。这样,在头文件classA.h和源文件classA.cpp都可以使用类B的东西了。
头文件classA.h源码如下:
#ifndef _CLASSA_H_
#define _CLASSA_H_
#include "classB.h"
class A{
public:
void display();
void callB(B *b);
};
#endif
源文件classA.cpp源码如下:
#include
#include "classA.h"
using namespace std;
void A::display(){
cout<<"this is class A"<display();
}
其次设计类B(包括头文件classB.h和源文件classB.cpp),这里,头文件classB.h是不能#include "classA.h",因为这样会和头文件classA.h形成相互包含,从而编译错误。那怎么样才能让头文件classB.h和源文件classB.cpp也都可以使用类A的东西呢?可以这样:头文件classB.h中声明类A,源文件classB.cpp中#include "classA.h"。头文件classB.h中声明类A,就是要告诉本模块类A是一个在其他地方声明定义的东西,在这里可以使用这个东西的名字,但由于还不知这个东西的具体定义,所以不能再这里实例化这个东西。
头文件classB.h源码如下:
#ifndef _CLASSB_H_
#define _CLASSB_H_
class A;
class B{
public:
void display();
void callA(A *a);
};
#endif
源文件classB.cpp源码如下:
#include
#include "classB.h"
#include "classA.h"
using namespace std;
void B::display(){
cout<<"this is class B"<display();
}
到这里,我们可以设计一个场景(main文件),源码如下:
#ifndef _MAIN_CPP_
#define _MAIN_CPP_
#include
#include "classA.h"
#include "classB.h"
using namespace std;
int main(){
int pause;
A *ap = new A();
B *bp = new B();
ap->callB(bp);
bp->callA(ap);
cin>>pause;
return 0;
}
#endif
运行结果如下:
可以看出:
类A调用了callB(B *b),而callB又调用了类B的display()
类B调用了callA(A *a),而callA又调用了类A的display()