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

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

相关推荐

Buck-Boost电路

前面我们学习了降压的Buck电路 (左图) 和升压的Boost电路 (右图),那么如果我们把Buck电路和Boost电路结合一下会发生什么情况? 我们尝试着画一下: 我们用Buck电路作为输入,然后用Boost电路进行调整,最后输出。因此Buck电路中的负载、Boost电路的电源都可以删掉。得到下图: 由于Buck电路中的C2的作用是在输出的时候滤波,这个功能已经由Boost电路中的C1实现了,因此可以删除Buck电路中的C2电容。得到下图: 这里两个电感处于串联状态,可以合二为一,得到下面的电路:

wangeil007的博客 4万+

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

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

FA1CAE的博客 1541

osgEarth实战:5分钟搞定3DTiles模型加载(附完整配置代码)

本文提供了一份osgEarth加载3DTiles模型的实战指南。通过详解核心Earth文件配置与精简的C++集成代码,帮助开发者快速在三维地球场景中集成倾斜摄影与BIM等海量模型,并分享了性能调优与常见问题排查技巧,有效提升开发效率。

jjj34的博客 480

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

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

青山绿水 8万+

python sci sci-hub 爬论文

sci-hub 爬虫 后续加入对于时间的排序,下载最新文献 参考: https://www.guanjihuan.com/archives/6846 https://blog.youkuaiyun.com/czh2637750821/article/details/115508922

weixin_42783619的博客 3542

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

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

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

u014804795的博客 1万+

相控阵雷达仿真入门:TWS与TAS模式实战解析(附代码示例)

本文深入解析相控阵雷达仿真中的TWS(边搜索边跟踪)与TAS(搜索加跟踪)模式,提供实战代码示例和优化策略。通过简化模型设计和对象化建模,帮助开发者快速构建高效仿真系统,适用于军事推演和装备评估。文章涵盖核心逻辑、数据结构设计及性能优化技巧,提升仿真效率与准确性。

weixin_30687051的博客 453

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

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

学无止尽,谨言慎行! 2626

安卓直链APK安装拦截全解析:从Play Protect到厂商管控的应对指南

在移动应用分发领域,APK(Android Package)安装是开发者与用户交互的关键环节。其核心原理涉及安卓系统的安全沙箱机制与权限管理体系,旨在保护用户设备免受恶意软件侵害。这一机制的技术价值在于平衡了应用生态的开放性与安全性,但也在应用推广、企业内部分发等场景中带来了挑战。尤其在通过官网、广告等直链渠道分发APK时,常会遇到安装转化率骤降的问题。这背后主要受到Google Play Protect云端扫描、安卓系统安装权限模型演进(如Android 8.0+的安装源授权)以及设备制造商附加安全层(如

weixin_33894640的博客 469

【异常】Claude Code CLI 模型调用异常 There‘s an issue with the selected model (claude-sonnet-4-6). It may not

摘要: Claude Code CLI v2.1.45版本存在适配缺陷,导致调用claude-sonnet-4-6模型时触发"模型不存在"的误报错误(跨Windows/Linux平台)。该问题为版本回归类异常,非模型或账户权限问题。解决方案包括:1) 校验模型名称格式为claude-sonnet-4-6;2) 降级至v2.1.34或等待官方修复;3) 检查API配置有效性;4) 通过CLI交互界面手动选择模型;5) 临时切换同系列可用模型。官方已确认该bug并将发布修复版本。

奶爸的编程之路,也就一周冷个三天 6388

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

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

ttz_csdn的博客 2万+

uniapp(全端兼容) - 最新详细实现支付键盘功能组件,从底部弹出数字键盘输入支付密码进行付款交互效果,自定义支付密码键盘仿微信、支付宝支付键盘,1~9密码数字键盘,电商支付(详细示例代码复制运行

uniapp,微信小程序,自定义数字键盘,输入支付密码的键盘组件,uniapp小程序如何实现从底部弹出输入支付密码自定义键盘功能,uniapp小程序密码支付键盘组件插件,自定义数字键盘输入页面,怎么封装底部弹窗自定义数字键盘用于输入支付密码,uniapp小程序仿类似电商支付密码输入模态框,uniapp微信小程序平台实现自定义支付密码键盘,uniapp 密码支付,数字键盘,安全键盘,交易键盘,交易密码,交易密码输入框,uniapp自定义支付键盘: uniapp自定义支付键盘,uniapp小程序端实现键盘输入支

✅ 精选推荐文章 2906

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

类与对象 方法的调用补充

qq_64004825的博客 1463

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

多个iframe间的相互调用

多个iframe间的相互调用

嗨呀丶的博客 792

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java中,方法的调用机制

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

小萌学习笔记 3611

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

使用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、付费专栏及课程。

余额充值