做项目过程中,一般会遇到两个类相互关联的情况,而这两个类又分别放在两个不同文件中,所以就“情不自禁”地相互包含对方的头文件,然后就“理所应当”地编译错误了。在这里,就讲一下如何让位于不同文件的的两个类相互关联。
首先设计类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 <iostream> #include "classA.h" using namespace std; void A::display(){ cout<<"this is class A"<<endl; } void A::callB(B *b){ b->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 <iostream> #include "classB.h" #include "classA.h" using namespace std; void B::display(){ cout<<"this is class B"<<endl; } void B::callA(A *a){ a->display(); }
到这里,我们可以设计一个场景(main文件),源码如下:
#ifndef _MAIN_CPP_ #define _MAIN_CPP_ #include <iostream> #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()