当前位置: 首页 > news >正文

C++:类之间的关系

类与类的关系分为纵向关系和横向关系,纵向关系即为继承关系(后续帖子会有介绍),横向关系大体上可分为四种:依赖,关联,聚合,组合(此顺序为关系由弱到强,即依赖最弱)。

下面我们来介绍一下这几个关系。

1.依赖

所谓依赖就是类A使用了类B,但这种使用是偶然的,暂时的,但B的变化会影响到A。比如我要敲代码,就要使用到电脑,那么我与电脑之间就是依赖关系。在代码方面表现为电脑类作为参数被我类在某方法中使用,如:

#include<iostream>
using namespace std;

class Computer
{
public:
	void Debug()
	{
		cout << "#include..." << endl;
	}
};

class Person
{
public:
	void Code(Computer* pCom)
	{
		cout << "小手劈里啪啦打代码" << endl;
		pCom->Debug();
	}
};

int main()
{
	Person ps;
	Computer pCom;
	ps.Code(&pCom);


	return 0;
}

UML类图:

2.关联

比依赖更强,不存在依赖的偶然性,一般都是长期的且双方关系平等,例如我和我的朋友。

在代码方面表现为被关联类以类的属性形式出现在关联类中或者关联类引用了一个类型为被关联类的全局变量,如:

#include<iostream>
using namespace std;

class Friend
{
public:
	int nRp;
public:
	Friend(int nRp)
	{
		this->nRp = nRp;
	}
public:
	void Play()
	{
		cout << "文能挂机喷队友,武能越塔送人头" << endl;
	}
};

class Person
{
private:
	Friend* pFriend;
public:
	Person()
	{
		pFriend = NULL;
	}
public:
	void SetFriend(Friend* pFriend)
	{
		if (pFriend->nRp > 60)
		{
			this->pFriend = pFriend;
		}
		else
		{
			cout << "人品不行" << endl;
		}
	}

	void Play()
	{
		if (pFriend != NULL)
		{
			pFriend->Play();
			cout << "真坑啊" << endl;
		}
		else
		{
			cout << "自己玩没意思" << endl;
		}
	}
};

int main()
{
	Friend f(80);
	Person ps;
	ps.SetFriend(&f);
	ps.Play();



	return 0;
}

UML类图:

3.聚合

聚合是关联的特例,它类似于一种包含,如公司与员工,家庭与家人,它体现的是整体与部分的关系,整体与部分是可以分离的,可以具有不同的生命周期,部分可以属于多个整体。

#include<iostream>
using namespace std;

class Person
{
public:
	void Play()
	{
		cout << "摇起来" << endl;
	}
};

class Family
{
public:
	Person* arr[10];
public:
	Family()
	{
		for (int i = 0; i < 10; i++)
		{
			arr[i] = NULL;
		}
	}
public:
	void PushPerson(Person* pPs)
	{
		for (int i = 0; i < 10; i++)
		{
			if(arr[i] == NULL )
			{
				arr[i] = pPs;
				return;
			}
		}
		cout << "没位置了" << endl;
	}
	void Play()
	{
		for (int i = 0; i < 10; i++)
		{
			if (arr[i] != NULL)
			{
				arr[i]->Play();
			}
			else 
			{
				cout << "---NULL---" << endl;
			}
		}
	}
};

int main()
{
	Person ps1,ps2,ps3;
	Family f;
	f.PushPerson(&ps1);
	f.PushPerson(&ps2);
	f.PushPerson(&ps3);

	f.Play();



	return 0;
}

UML类图:

4.组合

组合也是关联的特例,组合也称强聚合,与聚合不同的是,组合的部分与整体是不可分的,整体生命周期的结束也意味着部分的结束,如人和人的大脑之间就是组合关系。

#include<iostream>
using namespace std;

class Head
{
public:
	void Say()
	{
		cout << "哔哔赖赖" << endl;
	}
};

class Hand
{
public:
	void Move()
	{
		cout << "比比划划" << endl;
	}
};

class Person
{
private:
	Head head;
	Hand hand;
public:
	void Meeting()
	{
		head.Say();
		hand.Move();
	}
};

int main()
{
	Person ps;
	ps.Meeting();




	return 0;
}

UML类图:

相关文章:

  • 基于golang语言开发publicChain项目实战教程
  • Aseprite绘画流程案例(3)——卡通独角兽可爱
  • python入门笔记4
  • glob 用法技巧
  • 撕碎QT面具(4):horizontal Layout修改各个控件的比例大小
  • 【Golang 面试题】每日 3 题(五十九)
  • 以deepseek为例的AI学习及公司知识库的搭建
  • Golang 相关的github 开源项目
  • 便捷批量字符一键查找替换工具
  • 首页 layout 架子(element-plus菜单组件)
  • 解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”
  • 通过API 调用本地部署 deepseek-r1 模型
  • 关系中出现这10个信号,离分手就不远了(爱情友情都适用)
  • idea连接gitee后.反向创建仓库和分支
  • 前端基础入门:HTML、CSS 和 JavaScript
  • 【股票数据API接口28】如何获取强势股池数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • Scrapy:DownloaderAwarePriorityQueue队列设计详解
  • 企业软件合规性管理:构建高效、安全的软件资产生态
  • docker知识
  • 网工项目实践2.8 IPv6设计及网络优化需求分析及方案制定
  • 西北大学副校长范代娣成陕西首富?系家庭财富,本人已从上市公司退出
  • 中国人民抗日战争暨世界反法西斯战争胜利80周年纪念活动标识发布
  • 警方通报:某博主遭勒索后自杀系自导自演,已立案调查
  • 宁德时代港股募资预计最高至50亿美元:90%将投向匈牙利项目
  • 石家庄推动城市能级与民生福祉并进
  • 举牌代跳明码标价、留言不堪入目,未成年人擦边短视频成引流利器