gpt4 book ai didi

c++ - 如何在 C++ 中创建 "undo"?

转载 作者:可可西里 更新时间:2023-11-01 18:40:20 25 4
gpt4 key购买 nike

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

(该程序使用“列表”将文本字符串存储在文本文件中。它被存储然后被删除,除非我使用我创建的保存功能。)

顺便说一句,我的意思是在一个简单的控制台应用程序中创建一个撤消功能。

最佳答案

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

这个主题绝非微不足道,用谷歌搜索它会返回大量结果。许多应用程序实现“撤消”操作,并且有很多变体。

有 2 种设计模式可以帮助我们解决这个问题:

  • 命令:它是一个 Action 的具体化
  • Memento:存储状态(通常意味着某种形式的序列化)

Command 模式在图形环境中大量使用,因为通常有多种方法可以完成一个 Action 。以 Microsoft Word 中的保存为例:

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

当然保存可能是在另存为方面实现的。

Command 模式的优点是双重的:

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

现在,有很多问题可以撤消:

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

因为有各种各样的问题,所以有各种各样的策略:

  • 对于一个简单的命令,你可以考虑实现一个撤销(例如,添加一个字符可以通过删除它来撤销)
  • 对于更复杂的命令,您可以考虑将撤消实现为恢复以前的状态(这就是 Memento 发挥作用的地方)
  • 如果您有很多复杂的命令,这可能意味着很多消耗空间的Memento,那么您可以使用一种方法,即每次只记住一个快照 10 或 20 个命令,然后重做从最新快照到撤消命令的命令

事实上,您可以随意混合使用 CommandMemento,这取决于您系统的具体情况以及两者的复杂性。

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

关于c++ - 如何在 C++ 中创建 "undo"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2746076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com