在文本的第一部分,我们向你演示了最简单的灵活指针:copy_ptr。它最大的缺点就是不可以进行“拷贝——建立/赋值”操作,也就是说不能有多个copy_ptr对象指向同一个对象。
为了克服这个缺点,允许“拷贝——建立/赋值”操作,有多种实现方法可以选择,这些实现采用了不同的技术:
为了可以使用clone_ptr,我们必须首先让clone_ptr所指向的类型支持克隆函数。这就造成了另一个缺点:如果你要克隆一个类的对象,那么该类的所有基类都必须实现了clone()函数。不过,你可以通过继承clone_impl来做到这一点,如下所示:
// 从它导出你的类
template< class base>
struct clone_base
{
virtual base * clone() const = 0;
virtual ~clone_base() {}
};
// 同样从这里导出你的所有导出类 (虚的!)
template< class base, class type>
struct clone_impl
public virtual clone_base< base>
{
virtual base * clone() const
{
type * pThis = ( type *)this;
return new type( *pThis);
}
};
使用clone_ptr允许你轻松建立你指向对象的可写拷贝(克隆),而不是对象本身。你会发现,当该函数内部需要一个可写的参数拷贝时,clone_ptr的上述特性就非常有用了,如下所示:
void animal_speak( const clone_ptr< Animal> & pAnimal)
{
clone_ptr< Animal> clone = pAnimal;
// 注意:'speak()'不是const函数,它不能在‘pAnimal’中调用。
clone->speak();
}
下面是你在代码中需要实现的东东: