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"是一个无法实现的抽象类.
那么,我是否必须重新设计所有内容,或者是否有解决此问题的简单方法?
您应该将操作存储为指针,这将使编译器满意.
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
| 归档时间: |
|
| 查看次数: |
1292 次 |
| 最近记录: |