C++ 中聚合和组合的实现

聚合:通常广泛用于描述一个类的对象拥有其它类的对象的情况。

组合:是聚合的一种形式,其中拥有者类控制被拥有者类对象的生命周期。

 

在c++中,聚合(包含组合)通常是由一个类C包含另一个类D类型的成员变量(这种方式又被称为嵌入包含的方式),或者是由于类C具有一个指向D类型的指针的成员变量产生的(指针方式)。

 

通过指针聚合的好处:

 1,通过嵌入包含的方式,有时会造成不必要的数据重复和浪费。例如,一个Person类的属性中可能包含一个Country类的对象,而许多人的Country类的对象是一样的。使用指针方式的话,内存中只要存在一份country数据就可以了。

2,当某个国家的Country类的对象发生变化时,很多的Person类的对象都需要更新。使用指针方式的化只要更新那一份country数据就够了。

 

通过指针方式实现组合时要注意:

假设类C包含一个指向类D类型对象的指针,则需要在类C的构造函数中创建D类型的对象(new D),需要在类C的析构函数中销毁指针(delete)。这样才可以保证被拥有的对象的生命周期与其拥有者的生命周期是一致的。

 

参考博客:http://c.biancheng.net/view/1518.html

源码地址:https://github.com/guanguanboy/LearningCPlusPlus/tree/master/CompositeAndAggregationDemo

 

包含的进一步讨论:

        包含是一种简单灵活地复用已有类的方式。如果希望复用一个类的实现,或使用一个类的功能,使用包含是一种简单而有效的方法。在新类中封装一个已有类的对象,让它作为新类实现的一部分去完成相关的操作,实现新类的功能。

        包含一个已有类的对象作为新类的成员,这被称为“按值包含”。按值包含用来实现“整体--部分”的关系,在UML中将这种关系称为“组合(composition)”。组合关系的特点是成员对象是组合对象的一部分,随着组合对象的创建而创建,随着组合对象的撤销而撤销,成员对象并不作为独立元素对外展现。例如“汽车和引擎”的组合关系,汽车中包含引擎,引擎是汽车的一部分,对外展现的只是汽车的整体功能。

        在实际应用中还会遇到另一种类似于组合的关系,UML中称之为“聚合, aggregation”,聚合也描述组成关系,但是比组合更松散。例如,“球队由球员组成”,“网络由计算机组成”,“电子邮件中含有附件等”。聚合关系的特点是成员对象可以独立于聚合对象而存在。当聚合对象被创建或者撤销时,其成员对象不受影响,而只是他们之间的关系受到影响。例如,球队在初创建时可能没有球员;球队如果解散了,球员还存在,只是和球队之间没有组合关系了。球员可以脱离球队,新球员也可以加入球队。

        聚合关系在C++中也使用包含语法实现,只是不同于组合关系,聚合通常使用按指针(或)引用包含的语法。聚合对象中包含的是成员类对象的指针或者引用。如:

class  Computer{...};

class Network{

vector<Computer *> computers;

}

      由于组合与聚合这两种关系之间的区别过于微妙,一般建议在设计时使用组合表示明确的“整体-部分”关系,对聚合这样的关系也用关联来表示。对c++程序而言,组合关系的语义可以用按值包含的语法实现。聚合或关联都时用按指针包含的语法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值