新闻中心
c++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现
答案:通过枚举定义状态与事件,使用映射表实现状态转移,结合进入/退出动作处理,构建可扩展的C++有限状态机。

实现一个简单的有限状态机(Finite State Machine, FSM)在C++中可以通过类和状态转移表的方式完成。核心思路是将状态和事件抽象出来,通过映射关系决定状态如何迁移,并在进入或退出状态时执行相应动作。
定义状态与事件
首先明确系统有哪些状态和事件。比如设计一个简单的灯控系统:
- 状态:关(OFF)、开(ON)
- 事件:按下开关(TOGGLE)
可以用枚举来表示:
enum class State {
OFF,
ON
};
enum class Event {
TOGGLE
};
设计状态机类
创建一个FSM类,维护当前状态,并提供处理事件的接口。状态转移逻辑可以放在一个查找表中。
Pinokio
Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用
232
查看详情
#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×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中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站


2025-10-29
浏览次数:次
返回列表