Dav*_*uve 2 c++ inheritance abstract-class undo-redo
我已经定义了一个像这样的"Action"纯抽象类:
class Action {
 public:
    virtual void execute () = 0;
    virtual void revert () = 0;
    virtual ~Action () = 0;
};
并表示用户可以使用类执行的每个命令.
对于实际的撤消/重做,我想做这样的事情:
解开
Action a = historyStack.pop();
a.revert();
undoneStack.push(a);
重做
Action a = undoneStack.pop();
a.execute();
historyStack.push(a);
编译器显然不接受这个,因为"Action"是一个无法实现的抽象类.
那么,我是否必须重新设计所有内容,或者是否有解决此问题的简单方法?
您应该将操作存储为指针,这将使编译器满意.
std::vector<Action*> historyStack;
/*...*/
historyStack.push_back(new EditAction(/*...*/));
Action* a = historyStack.pop();
a->revert();
undoneStack.push(a);
另一个原因是为什么std::vector<Action> historyStack;不起作用,那就是切片.将派生类的对象添加到向量时,它们将被强制转换为基类并释放所有多态性.更多关于它:什么是对象切片?
编辑查看使用ptr_vector管理向量中对象的生命周期:http://www.boost.org/doc/libs/1_37_0/libs/ptr_container/doc/tutorial.html