C++ 两个包含类互相调用彼此的类成员变量和方法
来源:互联网 发布:linux 设置alias 编辑:程序博客网 时间:2024/05/18 22:14
在编写C++程序时,有时候我们想在一个类中调用另一个类中的成员变量或方法,比如:两个类 A和B ,A包含B,一般A中调用B中的方法比较简单,重点是子类B如何调用父类A中的成员变量或方法呢?
如果你选择在A.h和B.h中互相包含头文件,那么肯定会报错,因为检测的时候会出现循环检测引用,所以这个方法是不可取的。
正确的方式是:
1、在A.h头文件中包含B.h
2、在A.h头文件A类中声明一个B类的对象,可以是指针,也可以不是指针
3、在B.h头文件中用extern声明类A,然后在类B中声明一个A类的指针对象(必须是指针型)
4、在A.cpp和B.cpp中都只需要包含A.h,B.cpp不需要包含B.h
5、然后在A.cpp和B.cpp中分别定义A类的对象和B类的对象
6、将它们的指针分别传给对方的对象。如果是在不同的文件,也可以是this传值,比如在A.cpp中,给B.cpp中的A类对象传递A的当前对象,b->a=this;然后B类中的a就可以调用A类的成员方法了。
7、最后就可以互相调用彼此的对象了。
注意:在头文件中最好使用#ifndef #define #endif ,防止多重定义错误。
上代码:
A.h
#ifndef _A#define _A#include "B.h"//A的头文件导入了B的头文件class A{public:int a;B* objectb;//A的头文件导入了B的头文件,在调用B的时候就可以不用指针,也可以用指针public:A();int geta();void handle();void hello();};#endif _A
B.h
#ifndef _B#define _Bextern class A;//注意1:需要用extern声明Aclass B{public:int b;A* objecta;//注意2:调用A的时候需要用指针public:B();int getb();void handle();};#endif _B
A.cpp
#include <iostream>#include "A.h"using namespace std;A::A(){ this->a=100;}int A::geta(){ return a;}void A::hello(){ this->a=500; printf("%d\n",a);}void A::handle(){ cout<<"in A , objectb.b="<<objectb->getb()<<endl;}
B.cpp
#include <iostream>#include "A.h"//注意3:在B.cpp里面导入A的头文件 ,而不是B的头文件using namespace std;B::B(){this->b=200;}int B::getb(){return b;}void B::handle(){cout<<"in B , objecta->a="<<objecta->geta()<<endl;}
main.cpp
#include <iostream>#include <cstdlib>#include "A.h"using namespace std;void main(){A a;B b;a.objectb = &b;b.objecta = &a;a.hello();a.handle();b.handle();system("pause");}
最后附上代码可以下载,我使用的vs2012。点击打开链接
有问题和建议希望留言提出或者发邮箱给我,虚心倾听学习! 邮箱:1203782828@qq.com
阅读全文
0 0
- C++ 两个包含类互相调用彼此的类成员变量和方法
- C++两个类互相调用彼此的方法
- C++两个类互相调用彼此的方法
- 互相包含的两个类
- 两个类互相包含的问题
- 在C++/CLI的本地类中包含托管类成员变量的方法
- 在C++/CLI的本地类中包含托管类成员变量的方法
- 调用其他类成员变量的方法
- 类的成员函数和全局函数的互相调用
- 两个类互相定义为成员变量 C++
- C++两个类互相包含
- js 类的成员变量和方法
- 【类反射】类的调用(调用类中的成员:成员变量、方法、构造方法)
- 两个类互相包含对方成员,又在2个文件中的情况
- 解决类间成员函数调用的两个方法
- CWinAPP类的成员变量和成员方法
- C++中两个类互相包含的策略
- C++中两个类的头文件互相包含问题
- Python学习笔记6_class
- css复习——文字与文本 day3
- CentOS 7配置aliyun的yum源
- android应用异常退出快速重启
- Map的常用实现类
- C++ 两个包含类互相调用彼此的类成员变量和方法
- Installing FLTK with Visual Studio
- 最小白_mysql的安装
- 安装vue开发调试神器vue-devtools
- 英语月总结
- Universal-Image-Loader图片加载框架
- moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)
- springmvc 本地jsp发送ajax请求 前后端合体
- 使用Gitolite搭建轻量级的Git服务器