C++ FSM 设计和所有权

2023-12-14

我想为此语法实现一个 FSM/“下推自动机”解析器:具有范围和条件的解析器已经被“lexed”到有限状态机解析器

我有以下内容:

class State
{
public:
    virtual State* event( const string &token );
    State* deleteDaughter();
private:
    A* m_parent;
    A* m_daughter;
}
class SomeState : public State
{
public:
    State* event( const std::string &token );
}

With B's event()做(在许多 if-elseif 之后)return m_parent->deleteDaughter()。我知道这很可疑(并且会崩溃),但我需要返回父级的方法State来自女儿State并确保女儿State没有泄露。

我的事件循环如下所示:

while( somestringstream >> token )
    state = state->event();

在您责骂设计和最后一段代码之前,我尝试扩展一个过于简单的示例here,这看起来还不错。为了清楚和简洁起见,我将决定部分移交给各州本身。

我知道有很多关于这个主题的书籍,但我不是计算机科学家/程序员,我想自己学习做到这一点(当然,在 SO 所有友好人员的帮助下)。如果概念不清楚,请提问。谢谢!


仍然可以随意发表您对此的看法,但我已经找到了如何优雅地处理一切的方法:

第一:我的事件循环将保留指向最后一个的指针State*创建的。

第二:每个State有一个指向父级的指针State,在构造函数中初始化,默认为 0(如果用于除第一个之外的任何内容,则内存泄漏State*);这保证了任何国家都不会超出范围。

Third: State* endOfState()函数正是这样做的(我对此感到特别自豪。

State* State::endOfState()
{
    State* parent = m_parent; // keep member pointer after suicide
    delete this;
    return parent;
}

当从子类内部调用它时event(),它将正确删除自身,并返回父指针(在梯子中向上移动)。

如果仍然存在泄漏,请通知我。如果解决方案不清楚,请询问:)

PS:平心而论,灵感是从http://www.codeguru.com/forum/showthread.php?t=179284

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ FSM 设计和所有权 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 选择列表逻辑应位于 ASP.NET MVC、视图、模型或控制器中的什么位置?

    我觉得我的问题与这个问题很接近 但我想对这样的代码应该放在哪里进行更一般的讨论 Asp Net MVC SelectList 重构问题 https stackoverflow com questions 2149855 asp net mv
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul

随机推荐

  • NSNumber 与 NSArray 的原始 int

    我正在使用 Mac OSX 版 Cocoa 编程 第四版来学习 Objective C Cocoa 我对这个基本问题表示歉意 但我是那些真正需要了解一切事物内部结构才能对我有意义的人之一 而这本书并不总是能满足我的需求 我已经学习了 C 的
  • 对视图的显示进行动画处理

    我在视图上添加了一个按钮 视图与按钮大小相同 单击该按钮时 必须显示一个新视图 因此 在按钮的事件处理程序中 我将 newview 添加为添加按钮的视图的子视图 以便在单击按钮时显示 newview 我需要做的事情是 当我单击按钮时 必须从
  • Git:合并错误,然后恢复合并。现在无法再次合并分支

    我在 git 方面遇到了一点麻烦 这就是我所做的 我将最新的 master 合并到我的分支并推送它 后来意识到这个合并已损坏并恢复了合并 现在我正在尝试再次合并master 它说它是最新的 我能知道如何强制将 master 的所有更改合并到
  • AtomicInteger 的 getAndIncrement 实现

    AtomicInteger 的 getAndIncrement 实现执行以下操作 public final int getAndIncrement for int current get Step 1 get returns the vol
  • 保存 UITextField 测试的最佳方法:textFieldShouldReturn 或 textFieldDidEndEditing

    我的目标只是在用户单击键盘上的完成按钮后将文本保存在 UITextField 上 我可以在 extFieldShouldReturn 或 textFieldDidEndEditing 中执行此操作 有什么区别吗 还是有更好的方法 Thank
  • USB 调制解调器回显错误的字符

    我在 ttyACM0 端口上连接了 USB 调制解调器 当我打开 Minicom 之类的应用程序并尝试向其发送一些命令时 回显并不总是我输入的内容 例如 如果我输入 A 则会得到 如果我输入 T 我就会得到 T 串行端口似乎正在剥离我的传输
  • 如何使用 VBA 将图像嵌入到 Outlook 电子邮件中

    非常密切相关在outlook邮件正文中嵌入图片excel vba 我正在尝试将图像嵌入到 Outlook 电子邮件中 我正在使用以下代码片段 其中一半是从上面的帖子中窃取的 Sub PictureEmail Dim outApp As Ne
  • 只有一个 TRUE 复选框

    我有一列复选框 如果选中一个框 它将为另一个工作表中的单元格设置一个值 如果我选中 1 号框 它就会变为 true 而其余的仍然为 false 然后 如果我选中 2 号框 它也会随着 1 号框而变为 true 而其余的仍然为 false 这
  • DocuSign 认证的严格性

    来自 DocuSign API 要求信息 Y 我们的 API 认证审核涉及验证您是否每 15 分钟每个唯一信封的状态请求不超过 1 个 以便对以下方法进行轮询合规性 REST API GET accounts accountId envel
  • Windows 窗体中的多个用户

    我正在做一个项目 我需要一些实施想法 到目前为止我使用的是Windows 窗体 该应用程序将由同一台电脑上的不同用户使用 我不是一个善于交际的人 所以我会给你一个场景 1 该应用程序首先显示一个登录表单 2 用户 John 进入应用程序并通
  • 如何解决 JetBrains WebStorm“未解析的变量 webServ”警告?

    我正在利用WebStorm集成开发环境对于 Node js 开发 我正在尝试清除所有 WebStorm 警告和错误 剩下的错误是 未解析的变量 webServ 警告 但 req params webServ 的使用是正确的 我不想只删除 W
  • 如何在 C# 中将默认的 FlushMode 更改为 Commit?

    所以 已经说过了 如何改变FlushMode to Commit in C 我的意思是 在 Fluent NHibernate 中 FlushMode 默认设置为 Auto 所以 将 FluentMode 设置为Commit 我需要打开会话
  • 如何验证 JasperReports 中的空报表?

    我的情况是 当我无法通过查询检索 jasper 文件中的任何内容时 仍然会生成报告 我正在使用这行代码来生成报告 ByteArrayOutputStream baos new ByteArrayOutputStream JasperPrin
  • 重新抛出异常:为什么该方法在没有 throws 子句的情况下编译?

    在下面的源代码中我重新抛出一个Exception 为什么没有必要把throws方法签名上的关键字 public void throwsOrNotThrowsThatsTheQuestion try Any processing catch
  • 如何将 UserControl 放入 Visual Studio 工具箱

    我在项目中制作了一个用户控件 构建项目后 我需要将其放入我的工具箱中 并将其用作常用控件 但我不能 这UserControl位于我的项目命名空间中 我尝试过Choose Item在右键菜单中 但我没有找到添加它的方法 我在让它们自动添加到工
  • 在冻结图上使用 optimize_for_inference.py 后使用模型时出错

    我正在使用tensorflows script optimize for inderence py on the ssd mobilenet v1 coco model使用以下命令 python m tensorflow python to
  • ASP.NET 应用程序引发的 System.Security.SecurityException

    尝试部署 ASP 应用程序 它工作了一段时间 但每当访问该页面时就开始出现错误 AppNameHere 应用程序中的服务器错误 安全异常描述 应用程序试图执行 安全策略不允许的操作 为了授予此 申请所需权限请联系您的系统 管理员或更改应用程
  • Python 无法识别 MacPorts 安装的软件包

    预先感谢您的建议 背景 相对于这个网站上的人 我对编程很陌生 尽管进行了一些研究 但我不熟悉使用 Unix 类型的 shell 管理包真正涉及的内容 或者在 Java 博士 之外完成的任何事情 IDE 或默认 R GUI 我有一台 2008
  • Git 推送收到“错误:拒绝更新签出分支”

    这是我到目前为止所做的 我成功地将远程存储库克隆到本地计算机上的新目录 然后我在工作副本中编辑了一个文件 提交它 并尝试将其推送到远程存储库 这是我得到的错误 git push origin master email protected s
  • C++ FSM 设计和所有权

    我想为此语法实现一个 FSM 下推自动机 解析器 具有范围和条件的解析器已经被 lexed 到有限状态机解析器 我有以下内容 class State public virtual State event const string token