-2

在原型设计模式中,抽象基类的克隆方法实现如下

/* From Wikipedia */
class Prototype
{
public:
    virtual ~Prototype() { }

    virtual Prototype* clone() const = 0;
};

class ConcretePrototype : public Prototype
{
  ...
  virtual ConcretePrototype* clone() const 
  { 
      return new ConcretePrototype(*this); 
  } 
};

客户端创建一个对象,然后调用 clone() 方法创建该对象的副本

new ConcretePrototype(*this) 是否比 new ConcretePrototype( ) 便宜?

4

3 回答 3

1

你误解了clone().

它是一个“虚拟复制构造函数”。

构造函数实际上不能是虚拟的(甚至不是复制构造函数)。因此,解决方案是有一个方法,您可以调用您已经必须制作精确副本的对象。

克隆副本有自己的生命周期,因此可以安全地销毁原始副本。

通常,您希望实现类具有私有或受保护的复制构造函数,因此您不能直接调用它。

您甚至不必知道要克隆的对象的类型。并注意“协变”返回类型。

我不知道你说的“便宜”到底是什么意思。如果您为您的类实现一个复制构造函数,它通常应该至少与创建类的空实例然后复制到其中一样有效,并且通常更有效。

于 2013-04-16T10:33:31.417 回答
0

你应该copy c-tor在这个模式中使用,因为它是模式的意义。但在其他情况下 - 一切都取决于default构造函数和copy-constructor.

于 2013-04-16T10:27:25.143 回答
0

如果我理解正确你的问题是,给定代码:

ConcretePrototype original;
{some code}
ConcretePrototype copy1;
copy1 = *orignal.clone();
ConcretePrototype copy2(original);

是创造copy1copy2. 这是我可以看到您可以在一个代码示例中比较和使用克隆的唯一default c-tor方法copy c-tor

很可能是的。多少钱?很难说。默认构造函数可能以创建浅拷贝的方式实现,因此开销很小。

于 2013-04-16T10:34:34.803 回答