新闻中心
C++如何实现一个状态机_使用C++枚举和类实现有限状态机(FSM)
首先使用枚举定义状态,如TrafficLightState包含红、黄、绿;再通过类封装状态和行为,构造函数初始化当前状态为红灯;change方法根据当前状态切换至下一状态,displayState输出当前状态名称,实现清晰的状态管理与转换逻辑。

在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++枚举和类实现有限状态机(F
SM)的详细内容,更多请关注其它相关文章!
# 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值调用带指针接收者方法:原理与最佳实践


2025-12-01
浏览次数:次
返回列表