【发布时间】:2012-10-26 13:37:11
【问题描述】:
我正在为某种二叉树结构开发一个编辑器,我需要一个撤消功能。我考虑过使用命令模式来实现这一点。但是,我还没有找到将命令模式与我的二叉树结构一起使用的方法。
二叉树结构是通过指针组成的。所以一个节点知道它的父节点和子节点。当我现在想添加一个节点时,我会构造一个以父节点为参数的NodeAdd 对象并将其传递给UndoStack。为了删除现有节点,NodeRemove 对象将被传递给UndoStack,并带有指向Node 的指针作为参数。 NodeAdd 和 NodeRemove 都必须实现 undo() 和 redo()(当对象放在 UndoStack 上时会调用 redo())。
我面临的问题是,处理一个节点删除然后添加同一个节点应该被撤消的情况:
- 重做节点添加
- 重做节点删除
- 撤消节点删除
- 撤消节点添加
一旦执行 redo NodeRemove,Node 对象就会被销毁。在 undo NodeRemove 中可以再次构造一个新的 Node 对象,但是 undo NodeAdd 无法执行,因为它没有指向新构造的 Node 的指针.
我想我试图以错误的方式使用命令模式。我可能应该销毁或构造Node 对象,而不是在命令的构造函数/析构函数中,而不是在undo()/redo() 中。不幸的是,我不知道如何使用这种结构来做到这一点,而且我能找到的所有示例和建议都与文本编辑或编辑没有带有指针的动态结构的内容有关。
任何想法如何解决这个问题?
【问题讨论】:
标签: c++ design-patterns undo-redo