请问关于undo命令设计的有关问题

请教关于undo命令设计的问题
我最近在做一些用户界面方面的内容,需要对用户的各种操作提供undo,redo的支持。
  在开发过程中发现这些改变文档状态的操作,一般分为三种类型:创建一个对象,修改一个对象和删除一个对象。
  在创建和删除对象的时候,由于修改命令中会保存修改对象的引用。如果创建和删除对象真的删掉了实际的对象再重建一个,会导致修改命令中的引用对象失效。当然这点可以通过保存ID引用,或者直接在对象原地址上析构和重构来实现。
  碰到比较麻烦的问题是一个对象中又包含了子对象,可以对这些子对象进行添加删除修改等操作。如果用ID的方式来实现这种命令,那还必须构建一个层次结构的ID。
  不知道有没有人处理过这种层次结构对象的编辑,并提供undo,redo命令的一些经验,谢谢~

------解决方案--------------------
用一个结构,指明当前操作的类型,并包含相应类型的具体对象的指针
------解决方案--------------------
一点愚见:

删除对象,并不是delete,而是置一个擦除标记。所以删除对象的执行和undo,就是对擦除标记的维护。

对象修改的undo,可以用读入,写出接口来实现。
比如对象的基类有dataIn,dataOut两个虚接口,在修改对象之前,调用dataOut,将现在的数据写出,然后修改。如果undo,则调用dataIn,读入最近一次dataOut写出的数据。
dataIn和dataOut要求数据匹配。比如dataIn是读入2个int则dataOut也必须是写出2个int。
如果A对象有子对象B,则A::dataOut()里会调用B::dataOut(),A::dataIn()里也会调用B::dataIn()
------解决方案--------------------
不理解为什么要构建一个层次结构的ID。

我原来做过的一个工程是这样做的,把每一步的操作解析成一个命令帧,保存到历史操作栈里。一般的操作都是可逆的,undo的时候把栈顶指针回退1,并执行这组命令的逆命令。如果该组命令是不可逆的,则打开该帧前的最后一个关键帧,再一步步redo到该帧。redo很简单,直接交给命令解释器就可以了。
------解决方案--------------------
探讨

不理解为什么要构建一个层次结构的ID。

我原来做过的一个工程是这样做的,把每一步的操作解析成一个命令帧,保存到历史操作栈里。一般的操作都是可逆的,undo的时候把栈顶指针回退1,并执行这组命令的逆命令。如果该组命令是不可逆的,则打开该帧前的最后一个关键帧,再一步步redo到该帧。redo很简单,直接交给命令解释器就可以了。