新闻中心

C++如何实现一个状态机_使用C++枚举和类实现有限状态机(FSM)

2025-12-01
浏览次数:
返回列表
首先使用枚举定义状态,如TrafficLightState包含红、黄、绿;再通过类封装状态和行为,构造函数初始化当前状态为红灯;change方法根据当前状态切换至下一状态,displayState输出当前状态名称,实现清晰的状态管理与转换逻辑。

c++如何实现一个状态机_使用c++枚举和类实现有限状态机(fsm)

在C++中实现一个有限状态机(Finite State Machine, FSM)是一种常见且高效的方式,用于管理对象在不同状态之间的转换。通过结合枚举(enum)和类(class),可以清晰地定义状态、事件以及状态转移逻辑,使代码更易读、可维护。

使用枚举定义状态

首先,使用枚举类型来表示状态机中所有可能的状态。这能提高代码的可读性,并避免使用魔法数字或字符串。

enum class TrafficLightState {
    RED,
    YELLOW,
    GREEN
};

这里定义了一个交通灯的状态机,包含红、黄、绿三种状态。使用enum class可以避免命名污染,并提供类型安全。

设计状态机类

接下来,创建一个类来封装状态和行为。该类保存当前状态,并提供处理事件或触发状态转移的方法。

class TrafficLight {
private:
    TrafficLightState currentState;

public:
    TrafficLight() : currentState(TrafficLightState::RED) {}

    void change() {
        switch (currentState) {
            case TrafficLightState::RED:
                currentState = TrafficLightState::GREEN;
                break;
            case TrafficLightState::GREEN:
                currentState = TrafficLightState::YELLOW;
                break;
            case TrafficLightState::YELLOW:
                currentState = TrafficLightState::RED;
                break;
        }
    }

    TrafficLightState getState() const {
        return currentState;
    }

    void displayState() const {
        switch (currentState) {
            case TrafficLightState::RED:
                std::cout << "Red\n";
                break;
            case TrafficLightState::GREEN:
                std::cout << "Green\n";
                break;
            case TrafficLightState::YELLOW:
                std::cout << "Yellow\n";
                break;
        }
    }
};

这个类维护当前状态,通过change()方法模拟状态转移。每次调用时,根据当前状态切换到下一个状态。

扩展:支持事件驱动的状态转移

更复杂的状态机可以根据输入事件进行转移。可以通过引入事件枚举,并使用二维表或映射结构来定义状态转移规则。

网易人工智能 网易人工智能

网易数帆多媒体智能生产力平台

网易人工智能 233 查看详情 网易人工智能
enum class Event {
    TIMER_EXPIRED,
    EMERGENCY_STOP
};

// 简单的状态转移函数示例
void handleEvent(Event event) {
    if (event == Event::TIMER_EXPIRED) {
        change(); // 按照原逻辑切换
    }
}

在实际项目中,也可以使用std::map或查找表来配置“当前状态 + 事件 → 下一状态”的映射关系,提升灵活性。

优点与适用场景

这种基于枚举和类的实现方式简单直观,适合中小型状态机。其优势包括:

  • 状态清晰,类型安全
  • 逻辑集中,易于调试
  • 可扩展性强,便于添加新状态或事件

适用于游戏AI、协议解析、UI流程控制等需要明确状态管理的场景。

基本上就这些。通过枚举定义状态,类封装行为,C++中的状态机实现既简洁又高效。

以上就是C++如何实现一个状态机_使用C++枚举和类实现有限状态机(FSM)的详细内容,更多请关注其它相关文章!


# c++  # 渝中网站推广咨询电话  # 网站建设定制费用低  # seo网站优化培训图  # 淘宝seo提升  # 张家口营销推广靠谱公司  # 三种  # 中文网  # 可以通过  # 相关文章  # 适用于  # 交通灯  # 是一种  # 下一  # 如何实现  # 网易  # red  # switch  # mac  # 菏泽价格低的网站推广  # 校园网站建设课程  # 汕头seo优化加盟条件  # 哪个厦门seo好  # 鹤壁优化推广营销费用 


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


相关推荐: Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  顺丰快递查单号物流信息 顺丰快递小程序查询入口  Golang如何使用const iota_Go iota常量计数器讲解  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  Go语言中Map值调用指针接收器方法的限制与应对  知音漫客正版漫画平台_知音漫客官网账号登录  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  夸克AO3官网入口_AO3镜像网站2025推荐  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  快手网页版在线登录 快手网页版官网入口快速访问  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  J*a中实现Go语言select通道多路复用机制  J*aScript动态修改指定div内所有a标签样式指南  必由学官网快捷入口 必由学网页版在线学习平台  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  深入理解J*aScript Promise异步执行与微任务队列  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  word中如何让数字纵向排列_Word数字纵向排列方法  Golang如何使用net/url解析URL_Golang URL解析与处理方法  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  J*aScript数据结构转换:将对象数组按类别分组  vivo云服务网页版登录 怎么登录vivo云服务网页版  快手赚钱渠道_快手收益来源  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  使用Python高效删除Word宏并转换DOCM为DOCX格式  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  微博网页版主页入口 微博官方网站免登录访问  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  从J*aScript对象中精确提取指定属性的教程  jQuery Mask 插件中实现电话号码固定前导零的教程  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  CSS图片焦点样式实现教程:理解与应用tabindex属性  SteamMachine定价或为699美元 大家想入手吗?  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  Python getattr() 异常处理深度解析:避免程序意外退出  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  《GTA6》开发画面疑似泄露!这次可不是AI了  精准捕获:如何在页面中监听除特定元素外的所有点击事件  星露谷物语官网入口 星露谷物语游戏官网入口  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Go语言中对Map值调用带指针接收者方法:原理与最佳实践 

搜索