C++技巧:简单而又灵活的指针-copy_ptr和clone_ptr(二)

ZDNet软件频道 时间:2003-01-06 作者:BUILDER.COM |  我要评论()
本文关键词:cpptips
在文本的第一部分,我们向你演示了最简单的灵活指针:copy_ptr。它最大的缺点就是不可以进行“拷贝——建立/赋值”操作,为了克服这个缺点,允许“拷贝——建立/赋值”操作,有多种实现方法可以选择,这些实现采用了不同的技术:
第二部分

在文本的第一部分,我们向你演示了最简单的灵活指针:copy_ptr。它最大的缺点就是不可以进行“拷贝——建立/赋值”操作,也就是说不能有多个copy_ptr对象指向同一个对象。

为了克服这个缺点,允许“拷贝——建立/赋值”操作,有多种实现方法可以选择,这些实现采用了不同的技术:

  • auto_ptr—它有一个附加的“所有权”标志,它用来设置指针指向的对象。
  • shared_ptr—它为每个指向的对象都保存一个指向它的指针数,当指针数变为零,它自动删除它指向的对象。
  • clone_ptr—依靠一个克隆函数,克隆函数可以构造对象的副本。当你从clone_ptr对象B拷贝——建立/赋值clone_ptr对象A时,B指向的对象会复制一份保存在A中。

为了可以使用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();
}

下面是你在代码中需要实现的东东:

  • 从clone_base类导出你的基类。
  • 从clone_impl类中导出你的继承关系中其它的类,或者你自己定义克隆函数。

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134