C++ 两个包含类互相调用彼此的类成员变量和方法
2017-09-13 16:23
155 查看
在编写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
B.h
A.cpp
B.cpp
main.cpp
最后附上代码可以下载,我使用的vs2012。点击打开链接
有问题和建议希望留言提出或者发邮箱给我,虚心倾听学习! 邮箱:1203782828@qq.com
如果你选择在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 _B extern class A;//注意1:需要用extern声明A class 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
相关文章推荐
- C++两个类互相调用彼此的方法
- C++两个类互相调用彼此的方法
- 在C++/CLI的本地类中包含托管类成员变量的方法
- 在C++/CLI的本地类中包含托管类成员变量的方法
- c++两个类互相包含调用
- 两个类互相定义为成员变量 C++
- JavaSE第六十四讲:使用反射机制调用对象的私有方法、访问对象的私有成员变量
- 带有public static void main方法的类,其中的成员变量必须是static的,否则main方法没法调用。除非是main里的局部变量。因为main方法就是static的啊。
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨
- C++中两个类互相引用的解决方法
- Java中final和多态调用成员变量、成员方法的应用(基础详解)
- 用C++实现单件模式【包含两个char*变量】
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- C++下如何避免方法的方式并且安全的访问类的成员变量
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法 --转
- C++ 保存在两个cpp文件中函数,怎样声明才能互相调用?
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- c# 调用 研华库函数中 C++ 非托管 Dll 一例(包含指针成员的结构体的调用) [转贴]
- C++中两个类互相包含的策略