类间值传递,跨类调用方法

类间值传递,跨类调用方法

在继承之外,在C++中一个类成员函数调用另一个类成员的方法主要有:类的组合,友元类,类的前向声明,单例模式等,

项目场景:

现有类CPlayBackTask的实例对象pPlaybackData想要获取类CRadioTask实例化对象pRadioTask的成员变量m_ConnectStatus,m_sendFlag,m_line_id的值和调用WriteNetMessage成员函数;同时CRadioTask实例化对象pRadioTask想要调用CPlayBackTask的实例对象pPlaybackData的SendLineDataMessage()成员函数

//CPlayBackData.h
class CPlayBackTask 
{
public:
	CPlayBackTask(int lineId);
	virtual ~CPlayBackTask();
	virtual int Run();
private:
	void SendLineDataMessage();  
};

//CRadioTask.h
class CRadioTask : public CTaskBase
{
public:
	CRadioTask();
	virtual ~CRadioTask();

	virtual int Run();
	int WriteNetMessage(BYTE *pBuffer, USHORT uLen);
	
private:
	BYTE m_ConnectStatus;   //0-断开,1-连接
	BYTE m_sendFlag;		//0-未发送,1-已发送
    BYTE m_line_id;         //线路号
};

1 通过全局变量实现跨类调用

1.1 适用场景:

全局变量实现跨类调用,安全性低,容易出现错误,类实例个数多时非常不方便;通常适用于只有一个类实例的场景。

1.2 解决思路:

适用于只有一个CRadioTask类实例时,
利用CRadioTask的构造函数将pRadioTask指向this。具体做法:

是在CRadioTask.cpp中添加

CRadioTask* pRadioTask;

构造函数CRadioTask中添加

 pRadioTask=this;

就可以在整个工程中随意调用pRadioTask的成员变量和成员函数了,当然调用前需要用CRadioTask pRadioTask 先声明。*

1.3 执行代码:

eg: 类CPlayBackTask的实例对象pPlaybackData想要获取类CRadioTask实例化对象pRadioTask的成员变量m_ConnectStatus,m_sendFlag,m_line_id的值和调用WriteNetMessage成员函数
如下:


//CRadioTask.cpp
CRadioTask* pRadioTask;
CRadioTask::CRadioTask()  
{
	pRadioTask=this;
	//初始化发送标志位
	m_ConnectStatus = 0;
	m_sendFlag=0;
	m_line_id=0;
}

//CPlayBackData.cpp
extern CRadioTask* pRadioTask;

2 通过类的前向声明实现跨类调用

2.1 适用场景:

类的前向声明实现跨类调用 安全性高,尤其类实例个数多时非常快速方便,通常适用于多个类实例的场景。

2.2 解决思路:

在类内添加被调类的指针为成员变量,在被调用类的对象实例化以后,将被调用类的实例作为形参传入使用类的构造函数中,使用类在初始化时调用构造函数,将指针(成员变量)指向该实例,之后就可以通过关联的实例完成跨类调用。

注意:
类的前向声明只能用于定义指针、引用、以及用于函数形参的指针和引用, 前向声明的类是不完全的类型,因为只进行了声明而没有定义

前向声明的作用:
在预处理时,不需要包含#include"xxx",相对节约编译时间,方便的解决两种类类型互相使用的问题。

2.3 执行代码:

如下:

//CRadioTask.h

class CRadioTask;
class CPlayBackTask :public CTaskBase
{
public:
	CPlayBackTask(CRadioTask* pRadioTask);
	virtual ~CPlayBackTask();
	virtual int Run();
private:
	BYTE m_line_id;
	BYTE m_connectStatus;
	BYTE m_sendFlag;
	CRadioTask* m_radioTask;
};

//CRadioTask.cpp 
//实例对象pPlaybackData想要获取类CRadioTask实例化对象pRadioTask的成员变量m_ConnectStatus,m_sendFlag,m_line_id的值和调用WriteNetMessage成员函数
CPlayBackTask::CPlayBackTask(CRadioTask* pRadioTask)  
{
	m_radioTask=pRadioTask;
	m_line_id=m_radioTask->m_line_id;
	m_connectStatus=m_radioTask->m_ConnectStatus;
	m_sendFlag=m_radioTask->m_ConnectStatus;
}
int CPlayBackTask::WriteNetMessage(BYTE *pBuffer, USHORT uLen)
{
 return m_radioTask->WriteNetMessage(pBuffer,uLen);
}

//CRadioTask.cpp 中实例化CPlayBackTask,向CPlayBackTask传递pRadioTask实例
//实例化对象pRadioTask想要调用CPlayBackTask的实例对象pPlaybackData的SendLineDataMessage()成员函数封装在Begin函数中

int CRadioTask::Run()
{
	//启动发送回放数据的线程
	CPlayBackTask *pTask = new CPlayBackTask(this);
	pTask->Begin();
	if (pTask)
	{
		delete pTask;
	}
	return 0;
}

3 通过类的继承实现类间成员函数的调用

3.1 适用场景:

通过类的继承实现类间成员函数的调用,可以减少冗余代码。

3.3 执行代码:

如下:

//CRadioTask.h

class CRadioTask;
class CPlayBackTask :public CTaskBase
{
public:
	CPlayBackTask(CRadioTask* pRadioTask);
	virtual ~CPlayBackTask();
	virtual int Run();
private:
	BYTE m_line_id;
	BYTE m_connectStatus;
	BYTE m_sendFlag;
	CRadioTask* m_radioTask;
};

关于CTaskBase可以参考C++ 如何在类中创建线程

参考1:https://blog.csdn.net/qq_35721743/article/details/83592415
参考2:https://blog.csdn.net/qq_35721743/article/details/83592415

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值