如何在C++中创建"撤消"?

use*_*964 6 c++ function undo borland-c++

我需要创建一个撤消上一个任务/添加/更改的函数.我如何在Borland C++中执行此操作?

(程序使用"list"将文本字符串存储在文本文件中.除非我使用我创建的保存功能,否则它将被存储然后被删除.)

我的意思是在简单的控制台应用程序中创建一个撤销功能.

Mat*_* M. 16

我会给出另一个答案,但我认为到目前为止覆盖范围还不够.

这个主题远非微不足道,谷歌搜索返回了大量的结果.许多应用程序实现"撤消"操作,并且存在许多变体.

有两种设计模式可以帮助我们:

  • Command:这是行动的具体化
  • Memento:它包含存储状态(通常意味着某种形式的序列化)

Command模式在图形环境中大量使用,因为通常有各种方法来完成操作.想想在Microsoft Word 中保存例如:

  • 您可以单击保存图标
  • 您可以进入" 文件"菜单并单击" 保存"
  • 您使用快捷方式,通常是CTRL + S.

当然,保存可能是在保存时实现的.

Command这里的模式的优点是双重的:

  • 你可以创建一堆对象
  • 你可以要求每个对象实现一个undo操作

现在,有各种问题适合undo:

  • 某些操作无法撤消(例如,考虑rm在Linux上或Windows上的空垃圾桶操作)
  • 有些操作很难撤消,或者它可能不自然(你需要存储一些状态,对象通常会被销毁,但在这里你需要实际将它存储在撤消操作的命令中)
  • 通常我们认为undo/redo是一个堆栈,一些软件(主要是图形)建议撤消项目而不实际撤消之后所做的事情,这要实现起来要困难得多,尤其是当新的动作建立在撤消一个......

因为存在各种问题,所以有各种策略:

  • 对于简单的Command,您可以考虑实现撤消(例如,添加角色可以通过删除来撤消)
  • 对于更复杂的Command,您可以考虑将undo实现为恢复先前的状态(这是Memento启动的位置)
  • 如果你有很多复杂的命令,这可能意味着很多Memento消耗空间的命令,那么你可以使用一种方法,即每10或20个命令只记忆一个快照,然后将命令从最新的快照重做到撤消命令

事实上,你也许可以混合CommandMemento从容,这取决于你的系统的具体情况,因此任的复杂性.

我只考虑撤消开始执行的最后一个操作(然后使用一堆操作).撤消用户希望的任何动作的功能要复杂得多.


das*_*ang 13

要实现撤消,您需要在应用程序中创建"操作堆栈".但有两种基本方法:

  1. 知道你的基线(上次保存文件,或者自文件创建以来),记住所做的每一次更改,以便在需要撤消某些内容时,只需丢弃"最顶层"项并重新生成当前项从基线查看加上所有更改.单击"重做"然后将该项目放回堆栈.这样做的另一个好处是能够轻松地删除堆栈中任何位置的项目而不会弄乱其他撤消/重做选项,尽管需要特别小心以确保"更高"状态的应用程序符合用户的意图.

  2. 对于每个操作,存储对先前状态所做的更改以及在要撤消时恢复先前状态所需的更改.现在,当用户点击"撤消"时,只需执行"撤消"步骤即可.单击"重做"时,重新应用所做的更改.在某些情况下,"撤消"步骤将是"这就是以前的样子",但如果你想让用户删除不在堆栈顶部的物品然后需要移除上面的东西,那么这可能会造成严重破坏它.

正确的选择取决于很多因素,包括您可以/将携带多少数据.在某种意义上,选项#1更容易,但如果动作堆栈很大,则撤消任何内容都会变得很慢.