我有一段时间没有使用过C ++,而且我对实际语言的易用性感到非常满意。
无论如何,我正在尝试实现Command模式,我需要将一些命令对象实现映射到字符串键。我有一个字符串到命令的STL映射,我想复制命令。
基本上,
Command * copiedCommand = new Command( commandImplementation );
我想保留commandImplementation的功能。由于Command具有纯虚函数execute
,因此不起作用。这样做的正确方法是什么?
答案 0 :(得分:4)
一种方法是将它添加到Command类中:
public:
virtual Command * Clone() const = 0;
...然后在Command的各个子类中,实现Clone()以返回对象的副本:
public:
virtual Command * Clone() const {return new MyCommandSubclass(*this);}
完成后,您可以按照以下方式执行此操作:
Command * copiedCommand = commandImplementation->Clone();
答案 1 :(得分:1)
http://en.wikipedia.org/wiki/Prototype_pattern
原型模式是创造性的 软件中使用的设计模式 开发时的对象类型 创造是由一个决定的 原型实例,克隆 生产新物品。这种模式 习惯于:
- 避免使用的子类 客户端中的对象创建者 应用程序,就像抽象工厂一样 模式呢。
- 避免固有成本 在...中创建一个新对象 标准方式(例如,使用'新' 关键词)当它令人望而却步 对于给定的应用来说是昂贵的。
要 实现模式,声明一个 指定a的抽象基类 纯虚拟clone()方法。任何课程 需要“多态构造函数” 能力来源于 抽象基类和实现 clone()操作。
客户, 而不是编写调用的代码 硬编码的“新”运算符 class name,调用clone()方法 在原型上,打电话给工厂 带参数指定的方法 特定的具体派生类 期望,或调用clone()方法 通过提供的某种机制 另一种设计模式。
答案 2 :(得分:0)
如果Command
是抽象类,则无法直接调用复制构造函数。相反,您可以考虑创建一个返回对象深层副本的clone()
方法。这也可以是返回基类的纯虚方法,例如:
class Command {
public:
virtual Command* clone(void) const = 0;
};