c++ 学习笔记(47)-C++中两个类中互相包含对方对象的指针问题

来源:互联网 发布:星际淘宝网txt免费下载 编辑:程序博客网 时间:2024/06/06 11:39

前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义。。。所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是就改了设计方案:

[cpp] view plaincopy
  1. class A  
  2. {  
  3. public:  
  4.     A(B* pB):m_pB(pB)  
  5.     {  
  6.     }  
  7.   
  8. private:  
  9.     B* m_pB;  
  10. };  
  11.   
  12. class B  
  13. {  
  14. public:  
  15.     B() {}  
  16. private:  
  17.     int m_i;  
  18. };  

只在一个类中包含另一个类的指针(算是聚类吧,A不管理m_pB的死活),而在B需要A的属性时通过传递参数进去。这样有些麻烦,但是勉强达到了我的需求。

  今天,又遇到一个必须使用相互包含对象指针的问题,要不然通过参数传来传去麻烦的不得了。所以还是百度了下,结果终于找到了:(c++)两个类相互包含引用的问题。里面说的和我需要的差不多,解决方法是一样的。

  文章里面说的很清楚了,我也在这里复述一遍吧,主要解决的就是文件包含的问题:在A的头文件(A.h)中包含B的头文件(B.h),在A的源文件(A.cpp)中包含(A.h),在B的头文件中使用A的声明(class A;)而不是包含A的头文件,然后在B的源文件(B.cpp)中包含A的头文件和B的头文件。代码如下:

[cpp] view plaincopy
  1. // A.h  
  2. #include "B.h"  
  3. class A  
  4. {  
  5. public:  
  6.     A(B* pB):m_pB(pB) {}  
  7.     void useB();  
  8. private:  
  9.     B* m_pB;  
  10. };  
  11.   
  12. //A.cpp  
  13. #include "A.h"  
  14. void A::useB()  
  15. {  
  16.     //do something for m_pB  
  17. }  
  18.   
  19.   
  20. //B.h  
  21. class A;  
  22. class B  
  23. {  
  24. public:  
  25.     B(A* pA):m_pA(pA) {}  
  26.     void useA();  
  27.       
  28. private:  
  29.     A* m_pA;  
  30. };  
  31.   
  32. //B.h  
  33. #include "A.h"  
  34. #include "B.h"  
  35. void B::useA()  
  36. {  
  37.     //do something for m_pA  
  38. }  

这样的话B的头文件中不能有使用A的对象指针m_pA的代码,否则会出现“使用了未定义的A”错误。

  最后,问题算是解决了,但是我现在还是有点不明白的,这C++头文件的包含和类的声明等等都应该牵涉到编译器的编译顺序问题,忘大师为我讲解下这是为什么。

  谢谢观众的捧场!


来源:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html

0 0
原创粉丝点击