C++ 两个包含类互相调用彼此的类成员变量和方法

24 篇文章 1 订阅

      在编写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 _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



    

    


  • 9
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值