C++ 类之间的横向关系(组合、依赖、关联和聚合)

news2024/10/3 0:27:19

目录

组合(复合)

定义

举例

依赖 

定义

 举例

关联

定义

 举例

聚合

定义

举例


组合(复合)

定义

它是一种"is a part of"的关系,部分与整体,包含与被包含。组合是一个类中包含另一个类对象。相比聚合,组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,整体不存在,部分一定不存在。

举例

人与手、人与头之间的关系,人需要包含头和手,头。手是人的一部分且不能脱离人独立而存在。

在C++语法中,通常在组合类中包含被组合类对象来实现组合关系:

class CHand {
public:
	void move() {
		cout << "我的小手不断地移动" << endl;
	}
};
class CPeople {
public:
	CHand m_hand;
public:
	void clap() {
		m_hand.move();
		cout << "撞击...发出掌声" << endl;
	}
};
	{//组合复合
		CPeople peo;
		peo.clap();

	}

依赖 

定义

它是一种"uses a"的关系。一个对象的某种行为依赖于另一个类对象,被依赖的对象视为完成某个功能的工具,并不持有对他的引用,只有完成某个功能的时候才会用到,而且是必不可少的。依赖之间是没有生命周期约束关系的。

 举例

人要完成编程这件事,那么需要用到电脑,电脑作为一个工具,其他的时候不需要,电脑也不可能作为人的属性而存在(非组合关系),人必须依赖于电脑才能完成编程这件事。

C++语法中,代码的表现形式为多种,通常将被依赖的对象作为另一类方法的参数的形式实现两个类之间的依赖关系:

class CComputer {
public:
	void compile() {
		cout << "编译代码...生成可执行程序" << endl;
	}
};
	void coded(CComputer* pComp) {
		if (!pComp)return;

		m_hand.move();
		cout << "敲出一行行代码..." << endl;
		pComp->compile();
	}
	{//依赖
		CComputer comp;
		CPeople peo;

		peo.coded(&comp);
		peo.coded(nullptr);
	}

关联

定义

它是一种"has a"的关系。关联不是从属关系,而是平等关系,可以拥有对方,但不可占有对方。完成某个功能与被关联的对象有关,但可有可无,被关联的对象与关联对象无生命周期约束关系,被关联对象的生命周期由谁创建就由谁来维护。只要二者同意,可以随时解除关系或是进行关联,被关联的对象还可以再被别的对象关联,所以关联是可以共享的

 举例

人和朋友的关系,人要完成游戏这个功能,没有朋友可以自己玩游戏,如果交到朋友了就可以和朋友一起玩游戏。

C++语法中,通常在关联的类中定义被关联类对象的指针形式实现两个类之间的关联关系。

class CFriend {
public:
	void play() {
		cout << "我的朋友正在玩耍" << endl;
	}

};
	CFriend* m_pFri;
	CPeople(): m_pFri(nullptr){
		//m_pFri = nullptr;
	}
	void playGame() {
		if (m_pFri) {//有朋友
			m_pFri->play();
			cout << "我带着朋友一起玩" << endl;
			cout << "轻松拿下五杀" << endl;
		}
		else {//没有朋友
			cout << "我自己孤独的玩耍" << endl;
			cout << "勉强拿下五杀" << endl;
		}
	}
	{//关联
		CPeople peo;

		peo.playGame();

		CFriend fri;

		peo.m_pFri = &fri;//交朋友了

		peo.playGame();

	}

聚合

定义

它是一种"owns a"的关系。多个被聚合的对象聚集起来形成一个大的整体,聚合的目的是为了统一进行管理同类型的对象,聚合是一种弱所属关系,被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系,相当于强版本的关联。

举例

一堆人组成一个家庭,进行统一管理完成玩游戏的功能。

C++语法中,通常在聚合类中定义被聚合对象指针的数组、链表等容器。

class CFamily {
public:
	CPeople* arr[10];
public:
	CFamily() {
		for (CPeople*& pPeo : arr) {
			pPeo = nullptr;
		}
		arr[0] = new CPeople;
		arr[1] = new CPeople;
		arr[2] = new CPeople;
	}
	~CFamily() {
		for (CPeople*& pPeo : arr) {
			if (pPeo)
				delete pPeo;
			pPeo = nullptr;
		}
	}

	void AllPeoplePlay() {
		for (CPeople*& pPeo : arr) {
			if (pPeo)
				pPeo->playGame();
		}
	}
};

 注意:在强类型的for中要对数组中的成员进行赋值或删除等操作时,返回类型后要加引用&,如果不加引用就是对pPeo赋值。而不是对数组内成员赋值,只有将pPeo变为数组成员的小名,对其赋值才能传递到数组成员。

	{//聚合
		CFamily fam;
		fam.AllPeoplePlay();
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业如何高效管理新媒体矩阵账号?提升运营效率,监管内容风险

2023年&#xff0c;面对不确定的市场环境&#xff0c;更要精准把控业务动向&#xff0c;对于在抖音、小红书、视频号、快手等新媒体平台&#xff0c;布局大量账号的企业&#xff0c;实现矩阵账号的统一治理&#xff0c;不仅是应对市场不确定性影响的关键&#xff0c;更为有效降…

NC65合并报表如何取消上报并退回以及注意事项和相关问题总结

NC65合并报表如何取消上报并退回&#xff1f; 在【企业绩效管理】-【合并报表】-【合并】-【合并执行】节点中&#xff0c;点击〖数据中心〗按钮&#xff0c;在弹出的〖合并报表数据中心〗界面中&#xff0c;点击〖报送管理〗-〖合并方案请求退回〗&#xff0c;然后到【合并综…

Qt编写推流综合应用示例-文件推流

一、功能特点 1.1 文件推流 指定网卡和监听端口,接收网络请求推送音视频等各种文件。实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。可指定多种模式,0-直接播放、1-下载播放。实时打印显示各种收发请求和应答数据。每个文件对应MD5加密的唯一标识符…

JavaScript的基础

文章目录一、JavaScript 声明提升二、JavaScript 严格模式(use strict)三、JavaScript 表单四、JavaScript 表单验证五、JavaScript 验证 API总结一、JavaScript 声明提升 JavaScript 中&#xff0c;函数及变量的声明都将被提升到函数的最顶部。 JavaScript 中&#xff0c;变…

ClickHouse之采样查询(SAMPLE)

文章目录SAMPLE概念SAMPLE功能SAMPLE语法sample Ksample Nsample K offset mgroupArraySample语法SAMPLE概念 该 SAMPLE 子句允许近似于 SELECT 查询处理。 启用数据采样时&#xff0c;不会对所有数据执行查询&#xff0c;而只对特定部分数据&#xff08;样本&#xff09;执行…

电脑C盘被格式化 如何快速将被删的数据文件恢复找回?

如今的互联网时代&#xff0c;不管是办公还是休闲&#xff0c;一般都喜欢在电脑上进行操作&#xff0c;尤其是办公&#xff0c;感觉有了电脑能轻松不少&#xff0c;可以将一些工作中的重要数据保存在电脑里面&#xff0c;那么电脑里面的数据真就很安全了吗&#xff1f;这个就让…

Unity ShaderVariant 变体收集方案分析

最近遇到一个问题&#xff0c;在editor中场景渲染正确&#xff0c;打包android之后&#xff0c;渲染异常。 经过排查得出原因&#xff1a;工程把所有shader单独打包Assetbundle&#xff0c;editor打包ab包的时候&#xff0c;未收集到正确的shader变体&#xff0c;未将场景中使…

go语言并发编程

并发编程1.并发介绍1.1进程和线程1.2并发和并行1.3协程和线程1.协程2.线程1.4goroutine只是由官方实现的超级"线程池"2.Goroutine2.1使用Goroutine1.启动单个goroutine2.启动多个goroutine3.goroutine与线程3.1可增长的栈3.2goroutine调度3.runtime包3.1runtime.Gosc…

人员玩手机离岗识别检测系统 yolov5

人员玩手机离岗识别检测系统根通过pythonyolov5网络模型识别算法技术&#xff0c;人员玩手机离岗识别检测算法可以对画面中人员睡岗离岗、玩手机打电话、脱岗睡岗情况进行全天候不间断进行识别检测报警提醒。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很…

Nginx 的docker部署及宿主机配置文件修改重启

Nginx是一款高性能的Web服务器&#xff0c;用于反向代理、负载均衡、HTTP缓存等。在docker中部署Nginx可以更加方便地管理和配置。下面是部署Nginx的步骤&#xff1a; 步骤一&#xff1a;拉取Nginx镜像 首先需要从Docker Hub上拉取Nginx镜像&#xff0c;可以使用以下命令&…

windows11系统关闭右键【显示更多选项】

在新的Win11操作系统之中&#xff0c;微软为了美化界面&#xff0c;将右键菜单进行了整合更改&#xff0c;但是实用性却大幅度下降&#xff0c;引起了很多用户的反感&#xff0c;并迫切希望能够将Win11显示更多选项这个反人类的设置恢复成Win10的状态。 方法一&#xff1a;更改…

学成在线笔记0-面试问题

【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 介绍你的项目 项目难点 CDN是什么&#xff1f; 负载均衡是怎么做的&#xff1f; git使用了什么仓库&#xff1f; git代码冲突怎么处理&#xff1f; 你…

linux入门---文件系统

目录标题为什么会有文件系统磁盘的物理结构磁盘的存储结构磁盘的逻辑结构文件系统为什么会有文件系统 在我们的云服务器上存在着很多的文件&#xff0c;但并不是所有的文件都是被打开的&#xff0c;操作系统得管理好已经被打开的文件&#xff0c;那么同样的道理在磁盘中没有被…

Redis如何避免数据丢失?

Redis的持久化主要有两大机制 即 AOF(Append Only File)日志, RDB(Redis DataBase)快照。 AOF 日志是如何实现的&#xff1f; AOF是写后日志&#xff0c;就是Redis限制性命令&#xff0c;数据写入内存&#xff0c;然后才记录日志。AOF里记录的是Redis收到的每一条命令&#x…

uni-app--》如何制作一个APP并使用?

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

大数据应用——hbase shell操作

HBase 逻辑结构 HBase 物理存储结构 数据模型 1&#xff09;Name Space 命名空间&#xff0c;类似于关系型数据库的 DatabBase概念&#xff0c;每个命名空间下有多个表。HBase 有两个自带的命名空间&#xff0c;分别是 hbase 和 default hbase 中存放的是 HBase 内置的表&…

Android导入第三方SO库,上层Java调用(1)

Android导入第三方SO库&#xff0c;上层Java调用&#xff08;1&#xff09; &#xff08;1&#xff09;在module的build.gradle文件的android块中配置sourceSet&#xff1a; sourceSets {main {jniLibs.srcDir libs}} &#xff08;2&#xff09;在module的路径下&#xff0c;比…

[架构之路-166]-《软考-系统分析师》-4-据通信与计算机网络-2- 网络体系结构、协议

目录 4.2 网络体系结构与协议 4.2.1 网络互联模型 1. OSI / RM 各层的功能 2. TCP / IP 结构模型 4.2.2常见的网络协议 1 . 应用层协议 2 . 传输层协议 3 . 网络层协议 4.2.3网络地址与分配 4.2 网络体系结构与协议 网络体系结构是指计算机网络络的各层及其协议的集…

【k8s完整实战教程2】腾讯云搭建k8s托管集群

系列文章&#xff1a;这个系列已完结&#xff0c;如对您有帮助&#xff0c;求点赞收藏评论。 读者寄语&#xff1a;再小的帆&#xff0c;也能远航&#xff01; 【k8s完整实战教程0】前言【k8s完整实战教程1】源码管理-Coding【k8s完整实战教程2】腾讯云搭建k8s托管集群【k8s完…

Linux实战案列-发送告警邮件

发送告警邮件 准备 外部邮件服务器 首发在雪月书韵茶香 原因 本地自带邮箱容易被过滤&#xff0c;需要延迟性低的邮箱发送 配置docker 配置环境变量 主机版本&#xff1a;macOS 12.6.4 open .bash_profile export DOCKER_PATH"/Applications/Docker.app/Contents/Re…