C++学习之路(12)---类间通信之前置声明

来源:互联网 发布:智多星软件多少钱一年 编辑:程序博客网 时间:2024/06/06 09:04

两个类A和B实现互相调用彼此的方法,如果采用彼此包含对方头文件的方式会出现循环引用,所以采用了类的前置声明的方式

1,class A采用前置声明的方式声明class B

2,在ClassB的头文件中包含class A 的头文件

3,在class A中只能声明class B类型的指针或者引用

具体代码如下:

A.h:

[html] view plain copy
 print?
  1. #pragma once  
  2.   
  3. class B;  
  4. class A  
  5. {  
  6. public:  
  7.     A();  
  8.     A(class B* pB);  
  9.     ~A();  
  10.   
  11. public:  
  12.     void displayA();  
  13.     void invokeClassBInClassA();  
  14. private:  
  15.     class B *mB;  
  16. };  
A,cpp

[cpp] view plain copy
 print?
  1. #include "A.h"  
  2. #include "B.h"  
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6.   
  7. A::A()  
  8. {  
  9. }  
  10.   
  11. A::A(B * pB)  
  12. {  
  13.     mB = pB;  
  14. }  
  15.   
  16.   
  17. A::~A()  
  18. {  
  19. }  
  20.   
  21.   
  22. void A::displayA()  
  23. {  
  24.     cout << "this is A" << endl;  
  25. }  
  26.   
  27.   
  28. void A::invokeClassBInClassA()  
  29. {  
  30.     cout << "class A invoke class B starts>>" << endl;  
  31.     mB->displayB();  
  32. }  


B.h

[cpp] view plain copy
 print?
  1. #pragma once  
  2. #include "A.h"  
  3.   
  4. class B  
  5. {  
  6. public:  
  7.     B();  
  8.     ~B();  
  9.   
  10. public:  
  11.     void displayB();  
  12.     void invokeClassAInClassB();  
  13. private:  
  14.     class A * mA;  
  15. };  

B.cpp

[cpp] view plain copy
 print?
  1. #include "B.h"  
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5.   
  6. B::B()  
  7. {  
  8.     mA = new A();  
  9. }  
  10.   
  11.   
  12. B::~B()  
  13. {  
  14. }  
  15.   
  16. void B::displayB()  
  17. {  
  18.     cout << "this is the B" << endl;  
  19. }  
  20.   
  21. void B::invokeClassAInClassB()  
  22. {  
  23.     cout << "class B invoke class A starts >>" << endl;  
  24.     mA->displayA();  
  25. }  

main.cpp

[cpp] view plain copy
 print?
  1. #include <iostream>  
  2. #include "A.h"    
  3. #include "B.h"  
  4. using namespace std;  
  5.   
  6.   
  7.   
  8. int main()  
  9. {  
  10.     cout << "----------main starts---------------" << endl;  
  11.     class B* pB = new B();  
  12.     class A* pA = new A(pB);  
  13.   
  14.     pA->displayA();  
  15.     pA->invokeClassBInClassA();  
  16.   
  17.       
  18.     pB->displayB();  
  19.     pB->invokeClassAInClassB();  
  20.   
  21.     cout << "----------main  ends----------------" << endl;  
  22.     return 0;  
  23. }  
原创粉丝点击