clone函数很重要,要使用句柄类该是不可避免的需要定义clone函数。
回想为什么要使用句柄类,一开始,想用multiset来存储某个类的一些对象,这些对象可能存在父子关系,所以不能直接存放对象(子对象转化为父对象将丢失派生部分),那么只能存放指针,然而指针的管理麻烦(这点我倒是不清楚到底有多难)。这样就发明了句柄类,建一个类,该类包含两个指针,一个指针p指向一个希望存储的对象,另一个指针指向一个size_type类型的use整数存放该对象的引用数(引用数的作用即管理指针何时释放)。
回到我们的问题,clone函数干什么用,是这样的,对于一个我们希望存储的对象,我们要把这个对象跟句柄类关联起来才能存储。
那么有两种办法:一、直接把这个对象的地址赋值给句柄类里的p指针(即指向对对象的那个);二、用这个对象复制一个对象,再把这个复制出来的对象拿来跟p关联。
现在我来告诉你,第一种方法不可行:这个原始对象从哪来的我们不确定,如果这个对象的空间管理是由系统管理,那么我们不知道它何时就被释放了,也许能挺到main函数结束,也许在某个函数调用结束,它被释放了我们还能指向它么。或者这个对象用户还希望使用在很多地方,却由于use为0而被我们手工的释放了,这也是灾难。再说,这个对象要是再被拿去初始化另一个句柄类,那么造成的情况是我们有两群,是两群,看清楚了,这两群句柄对象,他们关联到同一个需要存储的对象,却各自有一个计数,相互独立,带来的问题是,该对象的释放如何统一?
所以,我们只能用第二种方法,我是说,我们的需要存储的对象与句柄类对象关联起来,我们用的方法是,用这个对象复制出一个新对象,而把这个新对象与句柄对象关联(重复一下:关联的方法就是把新建对象的地址赋值给句柄对象的p指针)。好了,对于某个我们希望关联到句柄类对象的对象,我们首先要复制它!耐心点,接下来便要讲到clone函数的意义了。在代码中,我们是如何关联的:在我们的句柄对象的构造函数里,传过来的的是需要存储的那群对象的基类引用,我们的构造函数要实现的功能就是根据这个引用复制一个与引用指向的对象相同的对象,问题是,引用他可能指向那一群对象中的任何一个,而接受引用的只是基类对象引用,如何根据基类引用接受的参数去复制派生类对象,你发现没有,在句柄类中是实现不了的!基类引用或指针根本无法调用派生类的方法,再重复,根据一个基类对象引用无法复制一个派生类对象出来。怎么办呢?我们复制不出来,让它自己复制一个给我们不就行了么,所以,关于复制对象的实现,不是在句柄类里,而是在需要被复制的对象所属的类里,那群对象各自有各自所属的类,在它们各自的类里都定义一个clone函数,当然,是虚函数,然后用基类引用接受了那群对象里的某一个,让该对象调用clone,根据多态的特性,它会调用自身所属的类得clone函数,用这个函数,当然可以复制出跟自身一摸一样对象,复制对象的目的就达到了,这就是clone函数的由来。
原文链接:http://hi.baidu.com/xp19871101/blog/item/7d1d99a66e5f2782d14358db.html