C++ undo/redo实现中的抽象类问题

Dav*_*uve 2 c++ inheritance abstract-class undo-redo

我已经定义了一个像这样的"Action"纯抽象类:

class Action {
 public:
    virtual void execute () = 0;
    virtual void revert () = 0;
    virtual ~Action () = 0;
};
Run Code Online (Sandbox Code Playgroud)

并表示用户可以使用类执行的每个命令.

对于实际的撤消/重做,我想做这样的事情:

解开

Action a = historyStack.pop();
a.revert();
undoneStack.push(a);
Run Code Online (Sandbox Code Playgroud)

重做

Action a = undoneStack.pop();
a.execute();
historyStack.push(a);
Run Code Online (Sandbox Code Playgroud)

编译器显然不接受这个,因为"Action"是一个无法实现的抽象类.

那么,我是否必须重新设计所有内容,或者是否有解决此问题的简单方法?

Igo*_*aka 8

您应该将操作存储为指针,这将使编译器满意.

std::vector<Action*> historyStack;
/*...*/
historyStack.push_back(new EditAction(/*...*/));
Action* a = historyStack.pop();
a->revert();
undoneStack.push(a);
Run Code Online (Sandbox Code Playgroud)

另一个原因是为什么std::vector<Action> historyStack;不起作用,那就是切片.将派生类的对象添加到向量时,它们将被强制转换为基类并释放所有多态性.更多关于它:什么是对象切片?

编辑查看使用ptr_vector管理向量中对象的生命周期:http://www.boost.org/doc/libs/1_37_0/libs/ptr_container/doc/tutorial.html