新闻中心

c++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现

2025-10-29
浏览次数:
返回列表
答案:通过枚举定义状态与事件,使用映射表实现状态转移,结合进入/退出动作处理,构建可扩展的C++有限状态机。

c++怎么实现一个简单的有限状态机_c++有限状态机fsm的设计与实现

实现一个简单的有限状态机(Finite State Machine, FSM)在C++中可以通过类和状态转移表的方式完成。核心思路是将状态和事件抽象出来,通过映射关系决定状态如何迁移,并在进入或退出状态时执行相应动作。

定义状态与事件

首先明确系统有哪些状态和事件。比如设计一个简单的灯控系统:

  • 状态:关(OFF)、开(ON)
  • 事件:按下开关(TOGGLE)

可以用枚举来表示:

enum class State {
    OFF,
    ON
};

enum class Event {
    TOGGLE
};

设计状态机类

创建一个FSM类,维护当前状态,并提供处理事件的接口。状态转移逻辑可以放在一个查找表中。

Pinokio Pinokio

Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用

Pinokio 232 查看详情 Pinokio
#include <iostream>
#include <map>

class LightFSM {
public:
    LightFSM() : currentState(State::OFF) {}

    void handleEvent(Event e) {
        auto it = transitions.find({currentState, e});
        if (it != transitions.end()) {
            State newState = it->second;
            exitAction(currentState);
            currentState = newState;
            entryAction(currentState);
        } else {
            std::cout << "No valid transition from current state for this event.\n";
        }
    }

private:
    State currentState;

    // 状态转移表:{当前状态, 事件} -> 下一状态
    std::map<std::pair<State, Event>, State> transitions = {
        {{State::OFF, Event::TOGGLE}, State::ON},
        {{State::ON,  Event::TOGGLE}, State::OFF}
    };

    // 进入状态时的动作
    void entryAction(State s) {
        if (s == State::ON) {
            std::cout << "Light is ON.\n";
        } else if (s == State::OFF) {
            std::cout << "Light is OFF.\n";
        }
    }

    // 退出状态时的动作
    void exitAction(State s) {
        if (s == State::ON) {
            std::cout << "Turning light OFF...\n";
        }
    }
};

使用示例

在main函数中创建状态机实例并触发事件:

int main() {
    LightFSM light;
    
    light.handleEvent(Event::TOGGLE); // 输出:Turning light OFF... Light is ON.
    light.handleEvent(Event::TOGGLE); // 输出:Turning light OFF... Light is OFF.
    light.handleEvent(Event::TOGGLE); // 输出:Light is ON.

    return 0;
}

这个实现方式结构清晰,易于扩展。如果需要支持更多状态和事件,只需更新枚举和转移表。动作逻辑也可以封装成函数指针或std::function,实现更复杂的进入/退出行为。

基本上就这些。不复杂但容易忽略的是边界情况处理,比如无效事件或未定义转移。加上断言或日志会更健壮。

以上就是c++++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现的详细内容,更多请关注其它相关文章!


# ai  # mac  # 并在  # 只需  # 可以用  # 放在  # 的是  # 如何用  # stream  # ios  # c++  # 黑河企业网站推广多少钱  # 网站建设大会  # 淄博seo服务  # 采用什么方面推广网站  # 网站seo关键词排名优化怎么做  # 什么是固定排名关键词  # 宁都网站推广  # 福建优化网站哪家专业  # 贵阳seo引擎怎么优化  # 共建设计师网站  # 中文网  # 下一  # 可以通过  # 相关文章 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  解决Python logging 中 datefmt 导致时间戳固定不变的问题  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  深入理解J*a链表中的IPosition接口与使用  PHP中高效并行检查多链接状态的教程  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  处理嵌套交互式控件:前端可访问性指南  高德地图怎么看全景照片_高德地图全景照片浏览教程  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  Django表单提交验证失败后保持字段值不刷新  css绝对定位元素脱离父容器怎么办_确保父元素position非static  在哪找SublimeJ远程工具_SFTP插件配置教程  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  抖音怎么赚钱_抖音创作者变现方法与途径指南  age动漫网站入口 age动漫官网直接访问入口  铃兰之剑为这和平的世界希里技能组及加点推荐  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  抖音网页版怎么|直播|_抖音网页版开播操作指南  J*aScript:在map操作中高效处理空数组  Go RPC HTTP服务正确实现与常见陷阱解析  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  Go语言中的*string:深入理解字符串指针  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  服务端验证_j*ascript输入检查  J*aScript中localStorage数据的获取、清洗与格式化教程  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  学习通网页版官方登录 超星学习通电脑端入口指南  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  C++ vector二维数组定义_C++ vector of vector用法  Angular Material 垂直步进器:实现底部到顶部排序的教程  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站 

搜索