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

java封装|跨类调用方法的三种途径,包含类作为参数传递、类作为属性声明详解【建议收藏~】 如何准确地进行不同类之间功能的衔接,还是相等重要的。接下来,介绍3种调用的类型。 阅读详情

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

在继承之外,在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.youkuaiyun.com/qq_35721743/article/details/83592415
参考2:https://blog.youkuaiyun.com/qq_35721743/article/details/83592415

在一个类中调用另一个类的数据成员的方法-程序实现 C++中,一个类需要调用另外一个类的数据成员时,经常不知道怎么做,这里整理了两种方法,来实现在一个类中调用另外一个类的数据成员。 立即下载

相关推荐

【2025CVPR】基于脉冲神经网络的能效目标检测模型:Multi-scale Spiking Detector(MSD)深度解析

本文提出了一种创新的多尺度脉冲神经网络目标检测器(MSD),通过生物启发的ONNB模块和MSDF框架实现了高效准确的目标检测。该模型采用端到端直接训练策略,在COCO数据集上达到62.0%mAP的精度,同时仅需7.8M参数和6.43mJ能耗,较传统方法提升2.8%精度并降低82.9%能耗。实验验证了其在小目标检测和事件数据处理的优越性,为边缘计算应用提供了新范式。

hasakie的博客 1109

Python面向对象——跨类调用【3种方法】

Python面向对象——跨类调用【3种方法】

FA1CAE的博客 1541

保姆级教程:用WorkVisual 6.0给你的KUKA机器人硬件做一次‘全身体检’与配置检查

本文详细介绍了如何使用WorkVisual 6.0对KUKA机器人进行全面的硬件诊断与配置检查。从环境准备到核心硬件模块检查,再到安全系统合规性验证,提供了保姆级教程,帮助技术团队快速掌握数字化诊断方案,提升工业机器人的健康管理效率。

weixin_27298377的博客 277

C++中一个类成员函数调用另一个类成员的方法

在C++中一个类成员函数调用另一个类成员的方法主要有:类的组合,友元类,单例模式等,下面主要讲讲这三种方法的实现 方法1:利用类的组合 组合通俗来讲就是类B有类A的属性,如声明一个Person类,再声明一个Teacher类,Person类对象有年龄和姓名成员,而Teacher类对象成员也有年龄和姓名属性,所以我们可以将类Person的对象作为类Teacher的成员变量,那么就实现了Teacher类...

青山绿水 8万+

华为硬件工程师笔试题

1、基尔霍夫定理的内容是什么?(仕兰微电子)   基尔霍夫定理包括电流定律和电压定律。   电流定律(KCL):在集总电路中,任何时刻,对任一结点,所有流出结点的支路电流的代数和恒等于零。   电压定律(KVL):在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于零。   2、平板电容公式(C=εS/4πkd)。(未知)   3、最基本的如三极管曲线特性。(未知)   4、描述反馈电路...

weixin_33717117的博客 2万+

【工具】GitHub学生认证+PyCharm配置Copilot全流程指南

本文提供了一份详细的GitHub学生认证及在PyCharm中配置Copilot的完整指南。通过完成A2F认证、准备有效材料并使用干净网络环境,学生可免费获取GitHub Copilot Pro订阅,极大提升编程学习与开发效率。

w7x8y9z的博客 1459

如何在两个类之间传递成员变量的值

c++中如何在两个类之间传递成员变量的值

u014804795的博客 1万+

保边滤波之Mean shift filter

保边滤波之Mean shift filter 目录 保边滤波之Mean shift filter 一、算法原理 二、练手实现的算法代码如下: 三、实现结果 一、算法原理 在OpenCV中,meanshift filter函数为 p...

大熊 1561

C++中跨类调用回调函数

文章目录鸣谢应用场景C++11实现方式类A源文件:类B源文件:调用方式C++11以前的实现方式类A源文件:类B源文件调用方式 鸣谢 本文参考:Erice_s博主 在此感谢。 应用场景 在网络编程中客户端收到服务器的数据往往需要回调到上层进行处理,这里就涉及到跨类回调函数的问题. C++11实现方式 简单模拟实现为:有两个类A 和 B, B收到数据后需要回调A中的接口。 技术点:使用bind和function组合实现。 类A源文件: /*************************************

学无止尽,谨言慎行! 2626

SAP-MM-采购过账接口(与WMS集成)-代码

1、判断传入值非空检验; 2、判断过账日期是否允许在当前期间; 3、判断是否为集采订单业务,是否审批完成; 4、判断是否发布标准成本发布(此业务场景与价格控制3+S有关) 5、保存日志表; 6、判断业务公司订单审批状态; 7、创建STO交货单、集采公司订单过账、STO公司间创建交货单、交货单过账(两步法)、过账失败回滚(冲销交货、删除交货单、冲销集采入库)

qq_32198063的博客 421

ExpressLRS(ELRS)接收机技术全景:从历史演进、技术底层到产业生态全解析——上

ExpressLRS(ELRS)是一种由全球开源社区驱动的双向射频遥控链路协议栈,其接收机作为核心终端,承担信号接收解调、遥控指令解析、飞控数据交互与遥测回传等关键功能。自2018年问世以来,ELRS凭借极致性能、低成本、开放生态和强兼容性,从航模DIY方案发展为消费级无人机领域的事实标准,并逐步渗透工业级场景。 ELRS接收机采用模块化分层架构,支持2.4GHz和900MHz双频段,通过LoRa、FLRC、FSK多调制模式实现低延迟与远距离平衡。其核心技术包括自适应跳频抗干扰、TDD双向链路和极简数据包。

bother3000的博客 304

C++跨类调用(类间值传递、跨类调用方法)

C++跨类调用(类间值传递、跨类调用方法)1.通过全局变量实现跨类调用(1)优缺点(2)思想原理(3)具体流程2.通过类内指针变量实现跨类调用(1)优缺点(2)思想原理(3)具体流程 在面向对象编程的时候经常会遇到不同类实例之间的跨类调用,包括跨类值传递以及跨类调用方法,实际运用是有很多方法都可以解决这一问题,今天主要总结2个常用且通用的方法。 1.通过全局变量实现跨类调用 (1)优缺点 优点: ...

ttz_csdn的博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java面向对象01 类与对象 方法的调用补充

类与对象 方法的调用补充

qq_64004825的博客 1463

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

多个iframe间的相互调用

多个iframe间的相互调用

嗨呀丶的博客 792

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java中,方法的调用机制

方法准备与类加载 → 创建栈帧并压入调用栈 → 参数压栈 → 执行方法体 → 返回结果并弹出栈帧 → 方法结束并释放栈帧

小萌学习笔记 3611

使用querystring,session变量以及server.Transfer方法来实现页面间的值传递

A         SP.NET提供了卓越的事件驱动编程模型,让开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,使用传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递值,同样的事情,在使用事件驱动编程模型的ASP.NET就不是那么容易了,当然了,我们仍然有一些方法可以实现同样的功能。本文将试着使用不同的可能的方法来解决这个问题,但可以预见是,本文将包含使用q

hyynet09的专栏 2007

Java方法的调用(值传递和引用传递)

系列文章目录 文章目录系列文章目录Java方法的调用一. 静态方法二.非静态方法三.实际参数和形式参数四.值传递和引用传递1.值传递2.引用传递 Java方法的调用 一. 静态方法 静态方法调用:类名.方法名; 二.非静态方法 1.实例化 new 2.对象类型 对象名 = 对象值 三.实际参数和形式参数 四.值传递和引用传递 1.值传递 ​ 方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作

weixin_46238738的博客 1932

java中方法的定义、调用,值传递,形参,实参

1、当我们定义两个类时,我们想在一个类里去调用另一个类的方法时,我们可以运用另一个类的类型.方法名()来实现。 2、当我们在同一个类中调用方法时,要看这个方法的修饰符是否有static修饰 (1)如果有static修饰的话,我们可以直接通过方法名进行调用。 (2)如果没有,我们需要通过实例化类的对象来调用方法 3、值传递、形参、实参:当我们定义一个方法时,方法后面如果有括号,括号里有参数,那么我们就把这个定义时,括号里的参数称为形式参数。例如: 在这个方法中,a和b就是形式参数...

BaoITcore的博客 709

【Java基础】 Java中是值传递还是引用传递

编程语言方法之间的参数传递策略被称为求值策略,求值策略有很多种,比较常见的就是值传递和引用传递。还有一种值传递的特例——共享对象传递。值传递和引用传递最大的区别是传递的过程中有没有复制出一个副本来,如果是传递副本,那就是值传递,否则就是引用传递。在Java中,其实是通过值传递实现的参数传递,只不过对于Java对象的传递,传递的内容是对象的引用。我们可以总结说,Java中的求值策略是共享对象传递,这是完全正确的。但是,为了让大家都能理解你说的,我们说Java中只有值传递,只不过传递的内容是对象的引用。

qq_41506014的博客 1121

Java方法调用到底是值传递还是引用传递

Java中只有值传递,没有引用传递这个概念

CharlesYan的博客 1528

面向对象编程学习笔记:从类、对象到方法调用的完整回顾

涵盖类与对象创建、方法调用机制、参数传递本质(值传递详解)、this关键字等关键概念,帮你建立清晰知识体系。适合编程学习者巩固基础,厘清常见误区。

qq_17862337的博客 1320

Java String类的值传递还是引用传递

我们都知道这样一句话:基本类型是值传递,对象都是引用传递。 如果是值传递,那么如果在方法里传入这个变量,如果在方法里改变了这个变量的值,那么这个改变的范围只是在方法里面起作用。 如果是引用传递,如果在方法里改变了这个变量的值。那么你真的改变了这个变量的值。不仅仅是在方法里面。、 举例:值传递。 public class Main { public static void main(String[] args) { int i1=5; testint(i1);

weixin_42036942的博客 1293

java中方法调用参数的值传递

java值传递

Clown_cw的博客 492

【08】 Java方法的定义 方法调用 什么是值传递和引用传递

方法的定义、形参、实参、方法调用、值传递、引用传递

千寻简笔记《chihiro-notes》已开源|公众号:千寻简 235

方法的调用

方法的调用 调用方式: 一个类(A)里面创建的方法,想要在另一个类(B)里面调用有两种方式 该方法用static修饰,则在另一个类调用时写为:类名B.方法名(参数) 该方法未加static修饰,需要在类B中将A类实例化 A类名 对象名=new A类名() //对象类型 对象名=对象的值 ​ 对象名.方法(参数); 方法互相调用时注意项: 一个类中,两个方法都是普通方法,可以直接互相调用 ​ 两个方法都是static修饰的,也可以直接互相调用 ​

super_lord的博客 948
上一篇: C++ 如何在类中创建线程
下一篇: 多线程按序打印
@SuBen
博客等级 码龄9年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值