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”关键字)创建新对象的固有成本,因为它对于给定的应用程序来说非常昂贵
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);