C++ 原型设计在以下代码中的行为

C++ 原型设计在以下代码中的行为,c++,c++11,C++,C++11,当我在线学习原型设计时,我得到了一个代码,但它看起来是我这边的错误,有人能检查并确认它吗 class Stooge { public: virtual Stooge* clone() = 0; virtual void slap_stick() = 0; }; class Curly : public Stooge { public: Stooge* clone() { return new Curly; } void slap_stick() { cout

当我在线学习原型设计时,我得到了一个代码,但它看起来是我这边的错误,有人能检查并确认它吗

class Stooge {
public:
 virtual Stooge* clone() = 0;
 virtual void slap_stick() = 0;
};

class Curly : public Stooge {
public:
    Stooge*   clone() { return new Curly; }
    void slap_stick() {
      cout << "Curly: suffer abuse\n"; }
    };

    Stooge* Factory::s_prototypes[] = {
        0, new Larry, new Moe, new Curly
    };
    Stooge* Factory::make_stooge( int choice = 3 ) {
        return s_prototypes[choice]->clone();
    }
class-Stooge{
公众:
虚拟Stooge*克隆()=0;
虚空拍打杆()=0;
};
卷发类:公众走狗{
公众:
Stooge*clone(){返回新卷曲;}
无效拍击棒(){
不能克隆();
}
make_stooge
Factory
中是否创建两个对象?因为

  • s_prototype[choice]
    返回一个对象和
  • s\u prototype[choice]->clone()
    再次返回另一个对象
它没有

Stooge* Factory::s_prototypes[] = {
0, new Larry, new Moe, new Curly
};
这是您的第一个对象创建

Stooge* Factory::make_stooge( int choice = 3 ) {
return s_prototypes[choice]->clone();
}

此函数克隆现有对象以返回新对象。根据示例代码,此处只创建了一个对象。

这是数组的声明(可能是私有的)

注意,我用nullptr替换了0。 它由对象的实例初始化

clone()应该复制对象。在您的情况下,它不会复制对象。您创建了一个简单的工厂,而不是原型。在您的特定情况下,它不是必需的方法,因为您可以将其实现为
Curly
(Moe和Larry也是如此)的复制构造函数

当要创建的对象类型由原型实例确定时,将使用此模式,原型实例将被克隆以生成新对象。此模式用于:

原型模式用于

  • 避免在客户端应用程序中使用对象创建者的子类,就像factory方法模式那样
  • 避免以标准方式(例如,使用“new”关键字)创建新对象的固有成本,因为它对于给定的应用程序来说非常昂贵
<> C++中常用的内容<代码>具体原型::克隆()/<代码>方法为

  return new ConcreteProtoType(*this);
有时需要添加一些代码,以按体系结构创建新实例。(初始化方法的调用?新表达式将是使用内存池的新位置?在构造函数中无法执行的某些操作,如调用虚拟方法?)


这需要定义复制构造函数,如果对象不能被浅复制(如果可以,为什么我们使用原型?

但从我的角度看它似乎有错误
什么错误?顺便说一句,你的
克隆()
甚至没有克隆,它只返回一个新的
卷曲的
对象。
s_prototype[选择]
不创建任何内容,它只返回一个指向已存在内容的指针。克隆应执行以下操作:
Stooge*clone(){return new Curly(*this);}
Prototype模式很少需要,主要是当创建新实例的成本比创建新实例的成本更高时copy@Swift在
Curly
的情况下,它们都是same@Caleth如果我们看到的代码是现实中唯一存在的代码,那么原型模式的唯一用法是合法的(Curly会有一些资源和一份副本c-tor)。否则,整个经验就像是学习如何有节奏地放屁。s_原型[choice]0x2b07245ccc20 s_原型[choice]->clone()0x2B07245CECA0打印时,我得到了两个不同的地址
  return new ConcreteProtoType(*this);