类的设计(二):句柄类


代理类能让我们在一个容器中类型不同但相互关联的对象,这种方法毒药为每个对象创建一个代理,并要将代理储存在容器中,创建代理将会复制所代理的对象,就像复制代理一样。但是,如果想避免复制该怎么做呢?

对于某些类来说,能够避免复制其对象是很有好处的。有时候对象可能很大,复制起来消耗很大。

 

 

打个比方:

假设有一天,电视台准备组织一个 XXX棋 复盘解说。我们用一个vector对象来代表棋盘,存储每个棋子的位置等等等等的信息。于是棋子的类的定义如下:


该类有默认构造函数,析构 ,赋值操作符重载等,废话不多说。

棋盘容器:

现在这个容器代表棋盘。现在有两个解说或很多个解说同时解说这个复盘,但是解说们各自并不知道除了自己还有多少其他解说在同时进行(暂且先不用理会这句话,下面会给出示例)。 然而这个容器(棋盘)只能供一个解说使用。那么有几种操作呢?

 

解决方案:

1.让工作人员在准备一个棋盘(在准备一个容器,同样的棋子,同样的摆法)


 

然后复制拷贝


问题出现了。假设我们有很多解说,那么每个解说都要配置一个容器吗?然后再进行复制操作???显然这种方案不可行,因为花费的代价太大了。

2.让两个解说共用一个棋盘,怎么操作呢?让很多个解说用直播的方式,这样可以看到棋盘的实时改变。(引用或者指针)


尽管只复制了对象的指针,但是新的问题出现了。前面说了,解说们并不知道该什么时候销毁对象,因为他们不知道自己后面还有多少解说来工作。那么有没有解决的方法?需要一种方法,让我们在避免某些缺点(如缺乏安全性)的同时能够获取指针的某些优点,尤其是能够在保持多态性的前提下避免复制对象的代价。

 

句柄类引入

解决方法:定义一个类,由于这些类的对象通常被绑定到它们所控制的类的对象上。通常被称为handle类(智能指针),定义如下:


default构造函数:创建后,引用计数+1

析构函数:当引用计数等于1的时侯,释放资源。

拷贝构造函数:直接指针赋值,引用计数+1

重载=号操作符:这里特别注意。解释在图中给出.

 

Handle 在这里仅复制 指针本身的值,比起整个对象,明显好许多!

当然C++已经给我们提供了智能指针shared_ptr


具体怎么用,这篇不予给出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值