当我在网上学习原型设计时,我得到了一个代码,但它看起来很错误,有人可以检查并确认吗
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();
}
make_stooge
中的{p> Factory
会创建两个对象吗?因为
s_prototypes[choice]
返回一个对象s_prototypes[choice]->clone()
再次返回另一个对象。 答案 0 :(得分:0)
没有。
Stooge* Factory::s_prototypes[] = {
0, new Larry, new Moe, new Curly
};
这是你创建的第一个对象。
Stooge* Factory::make_stooge( int choice = 3 ) {
return s_prototypes[choice]->clone();
}
此函数克隆现有对象以返回新对象。根据示例代码,这里只创建了一个对象。
答案 1 :(得分:0)
这是一个数组的声明(可能它应该是私有的)
{
...
"_shards": {
...
"failures": [
{
"shard": 0,
"index": "test2",
"node": "TGUboSt9SweF3KQBKnoVSg",
"reason": {
"type": "illegal_argument_exception",
"reason": "no mapping found for field [field1]"
}
}
]
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
},
...
}
注意,我用nullptr替换了0。 它是用对象实例初始化的。
clone()应该制作一个对象的副本。在你的情况下,它没有。而不是原型,你创建了一个简单的工厂。在您的特定情况下,它不是必要的方法,因为您可以将其实现为 Stooge* Factory::s_prototypes[] = {
nullptr, new Larry, new Moe, new Curly
};
的复制构造函数(Moe和Larry)。
当要创建的对象类型由原型实例确定时使用它,该实例被克隆以生成新对象。此模式用于:
原型模式用于
在C ++中,Curly
方法的常用内容将是
ConcreteProtoType::clone()
有时需要一些额外的代码来按架构创建新实例。 (调用初始化方法?新表达式将是一个使用内存池的新位置?我们可以在构造函数中执行某些操作,作为对虚方法的调用?)
如果对象不能被浅层复制(如果它可以,为什么我们使用原型?),那就需要定义复制构造函数。