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

2024-04-25 19:08

本文主要是介绍C++跨类调用(类间值传递、跨类调用方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 1.通过全局变量实现跨类调用
    • (1)优缺点
    • (2)思想原理
    • (3)具体流程
  • 2.通过类内指针变量实现跨类调用
    • (1)优缺点
    • (2)思想原理
    • (3)具体流程

在面向对象编程的时候经常会遇到不同类实例之间的跨类调用,包括跨类值传递以及跨类调用方法,实际运用是有很多方法都可以解决这一问题,今天主要总结2个常用且通用的方法。

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

(1)优缺点

优点: 简单,快速,方便理解,尤其类实例个数时非常方便。
缺点: 安全性低,类实例个数多少时非常不方便,容易出现错误。

(2)思想原理

定义若干全局指针变量存储每个类的每个实例对象的指针(当然是需要互相调用的,不调用的肯定是不写咯!!!),在实例化对象建立后将全局指针变量指向该实例对象,在任何地方(包括类内)都可以利用这个指针调用相应的方法,获得相应的成员变量。注意:每个实例对象对应一个指针,不是每个类,分不清类与实例的自行百度。

(3)具体流程

以下面的例子来说明具体的流程:
:现有 类A的实例对象a想要获取类B实例化对象b的成员变量m_b的值。
(a)A.h , B.h 都无需做任何修改。
(b)B.cpp中包含A的头文件,定义一个全局的B类指针pB。

			CB * pB = new CB;

(c)在实例化b的.cpp文件中添加

			extern CB * pB;	//extern表示变量或者函数的定义在别的文件中

(d)在b实例化时将pB指向b。

			CB * b = new CB();  //调用的构造函数不同时,应该传入参数pB = b;

注:这里也可以利用B的构造函数将pB指向b,适用于只有一个B类实例时。具体做法是在B.pp中添加

			extern CB * pB;

在B的构造函数中添加

			pB = this;		//构造的实例的指针保存在pB中;

这样就可以在整个工程中随意调用b的成员变量和成员函数了,当然调用前需要用extern CB * pB;先声明。

2.通过类内指针变量实现跨类调用

(1)优缺点

优点: 安全性高,尤其类实例个数时非常快速方便。
缺点: 相对复杂,理解稍微困难。

(2)思想原理

在类内添加被调类的指针为成员变量,在被调用类的对象实例化以后,将指针(成员变量)指向该实例,之后就可以通过关联的实例完成跨类调用。

(3)具体流程

以下面的例子来说明具体的流程:
:现有 类A的实例对象a想要获取类B实例化对象b的成员变量m_b的值;
类B的实例对象b想要获取类A实例化对象a的成员变量m_a的值。

(a)A.h , B.h 中分别包含对方的头文件。
(b)CA中添加B类的指针,CB中添加A类的指针;

			CB * pB;		//A.h中添加CA * pA;		//B.h中添加

此时编译连接会报错,因为这是一个“鸡生蛋,蛋生鸡的问题”
^ _ ^ 感兴趣可以研究一下C++的编译链接过程。下一步就是解决这一问题。
(c)A.h中A类声明前添加B类声明;B.h中B类声明前添加A类声明;

			class CB;	// A.h中A类声明前class CA;	// B.h中B类声明前

(d)指针实例化各类对象后,将指针指向各类的实例对象

			CA* a = new CA();		//注意构造函数......CB* b = new CB();		//注意构造函数// 实例化完成后立即进行关联a->pB = b;b->pA = a;

此时就可用类内的指针访问其他类实例对象的成员变量以及成员函数。

说了这么多肯定很多同学在疑惑为什么第二种方法这么复杂,存在的意义何在,再次简单说明一下第二种方法存在的合理性。
通常我们定义的一个类基本就只有一个或者少数几个类实例对象,这种情况有第一种方法就可以很快的完成开发(除非BOOS不让你用全局变量)。但是如果我们有100个A类的实例对象,每个都需要单独的读取或者调用B类的100实例对象中的某个实例对象的成员变量或者成员函数呢?是不是想想就头大呢?这么多全局变量,还要对应,光写代码时就会出错,同时还毫无安全性可言。这时利用第二种方法就可以较快速的完成开发。

由于本人能力限制,如果有不对的地方还望大神指正。

这篇关于C++跨类调用(类间值传递、跨类调用方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935536

相关文章

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

sql语句字段截取方法

《sql语句字段截取方法》在MySQL中,使用SUBSTRING函数可以实现字段截取,下面给大家分享sql语句字段截取方法,感兴趣的朋友一起看看吧... 目录sql语句字段截取sql 截取表中指定字段sql语句字段截取1、在mysql中,使用SUBSTRING函数可以实现字段截取。例如,要截取一个字符串字

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Python处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl