代理类能让我们在一个容器中类型不同但相互关联的对象,这种方法毒药为每个对象创建一个代理,并要将代理储存在容器中,创建代理将会复制所代理的对象,就像复制代理一样。但是,如果想避免复制该怎么做呢?
对于某些类来说,能够避免复制其对象是很有好处的。有时候对象可能很大,复制起来消耗很大。
打个比方:
假设有一天,电视台准备组织一个 XXX棋 复盘解说。我们用一个vector对象来代表棋盘,存储每个棋子的位置等等等等的信息。于是棋子的类的定义如下:
棋盘容器:
现在这个容器代表棋盘。现在有两个解说或很多个解说同时解说这个复盘,但是解说们各自并不知道除了自己还有多少其他解说在同时进行(暂且先不用理会这句话,下面会给出示例)。 然而这个容器(棋盘)只能供一个解说使用。那么有几种操作呢?
解决方案:
1.让工作人员在准备一个棋盘(在准备一个容器,同样的棋子,同样的摆法)
然后复制拷贝
问题出现了。假设我们有很多解说,那么每个解说都要配置一个容器吗?然后再进行复制操作???显然这种方案不可行,因为花费的代价太大了。
2.让两个解说共用一个棋盘,怎么操作呢?让很多个解说用直播的方式,这样可以看到棋盘的实时改变。(引用或者指针)
尽管只复制了对象的指针,但是新的问题出现了。前面说了,解说们并不知道该什么时候销毁对象,因为他们不知道自己后面还有多少解说来工作。那么有没有解决的方法?需要一种方法,让我们在避免某些缺点(如缺乏安全性)的同时能够获取指针的某些优点,尤其是能够在保持多态性的前提下避免复制对象的代价。
句柄类引入
解决方法:定义一个类,由于这些类的对象通常被绑定到它们所控制的类的对象上。通常被称为handle类(智能指针),定义如下:
析构函数:当引用计数等于1的时侯,释放资源。
拷贝构造函数:直接指针赋值,引用计数+1
重载=号操作符:这里特别注意。解释在图中给出.
Handle 在这里仅复制 指针本身的值,比起整个对象,明显好许多!
当然C++已经给我们提供了智能指针shared_ptr