新闻中心
c++怎么实现一个简单的状态机_c++状态机设计与实现实例
答案:C++中实现状态机有三种方式:枚举+switch适合简单场景但扩展性差;状态模式通过多态解耦状态行为,易于扩展;函数指针或std::function实现轻量级状态机,灵活适用于小型项目。

在C++中实现一个简单的状态机,核心思路是将对象的行为根据当前所处的“状态”进行切换。状态机适用于处理具有明确状态划分和状态转移逻辑的场景,比如游戏角色控制、协议解析、UI流程管理等。
1. 状态机的基本概念
状态机(State Machine)由以下几个要素组成:
- 状态(State):系统在某一时刻所处的特定情形。
- 事件(Event)或输入(Input):触发状态转移的外部动作或条件。
- 转移(Transition):从一个状态到另一个状态的变化过程。
- 动作(Action):状态转移时执行的操作。
最常见的是有限状态机(FSM, Finite State Machine),它只有有限个状态。
2. 使用枚举+switch实现简单状态机
这是最直观的方式,适合状态和事件不多的场景。
// 示例:灯的开关控制状态机 #include iostream>enum class LightState { OFF, ON };
void LightStateMachine() { LightState currentState = LightState::OFF; std::string input;
while (true) {
std::cout << "Current state: "
<< (currentState == LightState::ON ? "ON" : "OFF")
<< "\nEnter event (toggle/quit): ";
std::cin >> input;
if (input == "quit") break;
if (input == "toggle") {
if (currentState == LightState::OFF) {
std::cout << "Turning ON...\n";
currentState = LightState::ON;
} else {
std::cout << "Turning OFF...\n";
currentState = LightState::OFF;
}
} else {
std::cout << "Invalid event!\n";
}
}}
这个版本结构清晰,但扩展性差,新增状态或事件需要修改多个地方。
3. 面向对象方式:状态模式(State Pattern)
使用多态来解耦状态行为,更易于维护和扩展。
#include// 前向声明 class LightContext;
// 抽象状态类 class LightState { public: virtual ~LightState() = default; virtual void handle(LightContext* context) = 0; };
// 具体状态类 class OnState : public LightState { public: void handle(LightContext* context) override; };
class OffState : public LightState { public: void handle(LightContext* context) override; };
// 上下文类
class LightContext {
private:
std::unique_ptr
void request() {
if (currentState) {
currentState->handle(this);
}
}};
易想商务网
YxB2B商务网是易想网络旗下的门户型B2B行业网站系统,采用先进的标签技术和静态生成技术,通过网站后台管理轻松实现网站前台多种风格和会员网站多风格,让每一个只要懂得简单网页制作常识的网友,轻松制作出精美专业的的行业商务网站系统。系统高速、稳定、安全,完全仿阿里巴巴功能设计,有供应信息、求购信息、产品库、公司库、专项商机、行业信息、展会服务、人才市场、会员助手、网商博客、商友论坛、全方位搜索等栏目
0
查看详情
// 实现具体状态的行为
void OnState::handle(LightContext* context) {
std::cout setState(std:
:make_unique
void OffState::handle(LightContext* context) {
std::cout setState(std::make_unique
// 使用示例
int main() {
LightContext light;
light.setState(std::make_unique
for (int i = 0; i < 5; ++i) {
light.request();
}
return 0;}
这种方式的优点是新增状态只需添加新类,符合开闭原则。每个状态的行为独立封装,逻辑清晰。
4. 使用函数指针或std::function实现轻量级状态机
如果不想引入复杂的类体系,可以用函数对象简化实现。
#include以上就是c++++怎么实现一个简单的状态机_c++状态机设计与实现实例的详细内容,更多请关注其它相关文章!
# ai
# mac
# 的是
# 如何用
# 所处
# 适用于
# 面向对象
# 多态
# 商务网
# stream
# switch
# ios
# c++
# 湖北营销网络推广哪家好
# 企业网站建设框架
# 软文营销推广咨询电话
# 关键词排名优化qk金手指效率
# 平潭专业seo报价
# 丰台区seo
# 做推广网站选云速捷认可
# 写字楼咖啡厅营销推广
# 济南网站建设路拍照
# 句容网站建设美丽中国
# 多个
# 几个
# 这是
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
PostgreSQL海量数据高效导入策略:Python与Django实践指南
AO3最新可访问网址 Archive of Our Own官方在线入口
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
Lar*el DB::listen 事件中的查询执行时间单位解析
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
如何将HTML表格多行数据保存到Google Sheets
mc.js免安装版 mc.js一键畅玩入口
MongoDB聚合管道:正确匹配对象数组中_id的方法
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
Golang指针如何与map组合使用_Golang map指针组合实践
高德地图怎么看全景照片_高德地图全景照片浏览教程
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
将JSON对象数组转置为键值对列表的实用指南
Promise错误处理:在catch后终止链式then执行的策略
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
Golang如何使用context实现超时取消_Golang context超时取消模式实践
如何在Promise链中有效终止错误处理后的执行
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
在Pyomo中实现基于变量的条件约束:Big-M方法详解
J*aScript中针对特定容器内图片动画的实现教程
Bing引擎入口最新2025 Bing搜索免费官方登录
夸克AO3官网入口_AO3镜像网站2025推荐
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
多闪网页版在线观看免费入口_多闪官网访问入口
网易大神账号申诉需要多久_网易大神账号申诉流程说明
解决J*aScript中重复选择项的确认对话框显示问题
不同用户不同价格! 索尼开启账户个性化定价测试
Go语言中JSON数据解析与字段访问教程
微信客户端如何收红包_微信客户端接收红包使用教程
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
必由学官方网站入口 必由学学生教师共用登录通道
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
DLsite中文平台入口 DLsite官网内容在线查看
c++中为什么推荐使用using替代typedef_c++现代化类型别名
VS Code远程开发时如何处理文件权限问题
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
Tabulator表格日期时间排序问题及自定义解决方案
今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程
J*a应用程序首次运行自动创建文件与目录的最佳实践
TikTok网页版直接登录 TikTok网页端官方平台入口
Go语言中Map值调用指针接收器方法的限制与应对
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
解决深度学习模型训练初期异常高损失与完美验证准确率问题
vivo云服务网页版登录 怎么登录vivo云服务网页版
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"


2025-11-18
浏览次数:次
返回列表