1、做项目过程中,一般会遇到两个类相互关联的情况,而这两个类又分别放在两个不同文件中,所以就“情不自禁”地相互包含对方的头文件,然后就 “理所应当”地编译错误了。在这里,就讲一下如何让位于不同文件的的两个类相互关联。首先设计类 A(包括头文件 classA.h 和源文件 classA.cpp),其中头文件 classA.h 要#include “classB.h“,而源文件 classA.cpp 又#include“classA.h。这样,在头文件classA.h 和源文件 classA.cpp 都可以使用类 B 的东西了。头文件 classA.h 源码如下:cpp view plaincopyp
2、rint?1. #ifndef _CLASSA_H_ 2. #define _CLASSA_H_ 3. 4. #include “classB.h“ 5. 6. class A 7. public: 8. void display(); 9. void callB(B *b); 10. ; 11. 12. #endif 源文件 classA.cpp 源码如下:cpp view plaincopyprint?1. #include 2. #include “classA.h“ 3. 4. using namespace std; 5. 6. void A:display() 7. coutdis
3、play(); 12. 其次设计类 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 是一个在其他地方声明定义的东西,在这里可以使用这个东西的名字,但由
4、于还不知这个东西的具体定义,所以不能再这里实例化这个东西。头文件 classB.h 源码如下:cpp view plaincopyprint?1. #ifndef _CLASSB_H_ 2. #define _CLASSB_H_ 3. 4. class A; 5. class B 6. public: 7. void display(); 8. void callA(A *a); 9. ; 10. 11. #endif 源文件 classB.cpp 源码如下:cpp view plaincopyprint?1. #include 2. #include “classB.h“ 3. #inclu
5、de “classA.h“ 4. 5. using namespace std; 6. 7. void B:display() 8. coutdisplay(); 13. 到这里,我们可以设计一个场景(main 文件),源码如下:cpp view plaincopyprint?1. #ifndef _MAIN_CPP_ 2. #define _MAIN_CPP_ 3. 4. #include 5. #include “classA.h“ 6. #include “classB.h“ 7. 8. using namespace std; 9. 10. int main() 11. int pause; 12. 13. A *ap = new A(); 14. B *bp = new B(); 15. 16. ap-callB(bp); 17. bp-callA(ap); 18. 19. cinpause; 20. return 0; 21. 22. 23. #endif 运行结果如下:可以看出:类 A 调用了 callB(B *b),而 callB 又调用了类 B 的 display()类 B 调用了 callA(A *a),而 callA 又调用了类 A 的 display()