c++状态机实现示例

普通状态机的实现

#include <iostream>
#include <string>
#include <unordered_map>
#include <functional>using namespace std;// 状态机状态的枚举
enum class State {Idle,Active,Suspended,Downloading,Uploading,Error
};// 事件的枚举
enum class Event {Start,Stop,Suspend,Resume,DownloadStart,DownloadComplete,UploadStart,UploadComplete,ErrorEncountered
};// 状态机类
class StateMachine {
public:StateMachine() : currentState(State::Idle) {}// 处理事件的方法void handleEvent(Event event) {auto it = stateTransitionTable.find(make_pair(currentState, event));if (it != stateTransitionTable.end()) {// 执行状态转移和相应的操作auto transition = it->second;currentState = transition.first;transition.second(); // 执行与状态转移相关的操作cout << "Transition: " << stateToString(currentState) << endl;} else {cout << "Invalid transition from " << stateToString(currentState) << " on event " << eventToString(event) << endl;}}private:State currentState;// 状态转移表,使用unordered_map存储当前状态和事件到下一状态及其对应的处理函数unordered_map<pair<State, Event>, pair<State, function<void()>>> stateTransitionTable {{ {State::Idle, Event::Start}, {State::Active, [](){ cout << "Machine started." << endl; }} },{ {State::Idle, Event::ErrorEncountered}, {State::Error, [](){ cout << "Error encountered. Transition to Error state." << endl; }} },{ {State::Active, Event::Stop}, {State::Idle, [](){ cout << "Machine stopped." << endl; }} },{ {State::Active, Event::Suspend}, {State::Suspended, [](){ cout << "Machine suspended." << endl; }} },{ {State::Suspended, Event::Resume}, {State::Active, [](){ cout << "Machine resumed." << endl; }} },{ {State::Active, Event::DownloadStart}, {State::Downloading, [](){ cout << "Downloading started." << endl; }} },{ {State::Downloading, Event::DownloadComplete}, {State::Active, [](){ cout << "Downloading completed." << endl; }} },{ {State::Active, Event::UploadStart}, {State::Uploading, [](){ cout << "Uploading started." << endl; }} },{ {State::Uploading, Event::UploadComplete}, {State::Active, [](){ cout << "Uploading completed." << endl; }} }// 可根据需求继续添加更多状态和事件的转移规则};// 辅助方法,将状态和事件转换为字符串以便输出string stateToString(State state) {switch (state) {case State::Idle: return "Idle";case State::Active: return "Active";case State::Suspended: return "Suspended";case State::Downloading: return "Downloading";case State::Uploading: return "Uploading";case State::Error: return "Error";default: return "Unknown";}}string eventToString(Event event) {switch (event) {case Event::Start: return "Start";case Event::Stop: return "Stop";case Event::Suspend: return "Suspend";case Event::Resume: return "Resume";case Event::DownloadStart: return "DownloadStart";case Event::DownloadComplete: return "DownloadComplete";case Event::UploadStart: return "UploadStart";case Event::UploadComplete: return "UploadComplete";case Event::ErrorEncountered: return "ErrorEncountered";default: return "Unknown";}}
};int main() {StateMachine machine;// 通过不同的事件触发状态机的状态变化和相关操作machine.handleEvent(Event::Start);machine.handleEvent(Event::DownloadStart);machine.handleEvent(Event::DownloadComplete);machine.handleEvent(Event::UploadStart);machine.handleEvent(Event::UploadComplete);machine.handleEvent(Event::Suspend);machine.handleEvent(Event::Resume);machine.handleEvent(Event::Stop);machine.handleEvent(Event::ErrorEncountered);return 0;
}

状态模式的状态机的实现

个人认为非常不实用,开销大,不简洁,个人理解也就是易扩展这个优点,并没有感知到其他的优势。
除了那种真的有大几十种上百种的状态,也许会考虑下这种方式
理论性大于实用性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

筑牢代码安全之盾 —— 沙箱在源代码防泄密中四大特性

在这个数字化飞速发展的时代&#xff0c;源代码作为企业的核心资产&#xff0c;其安全性显得尤为重要。一旦泄露&#xff0c;不仅可能导致知识产权的损失&#xff0c;还可能引发一系列连锁反应&#xff0c;威胁企业的生存和发展。在这样的背景下&#xff0c;SDC沙盒以其独特的产…

电子电气架构 --- 关于DoIP的一些闲思 下

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【密码学】大整数分解问题和离散对数问题

公钥密码体制的主要思想是通过一种非对称性&#xff0c;即正向计算简单&#xff0c;逆向计算复杂的加密算法设计&#xff0c;来解决安全通信。本文介绍两种在密码学领域内最为人所熟知、应用最为广泛的数学难题——大整数分解问题与离散对数问题 一、大整数分解问题 &#xf…

【pyqt-实训训练LOG】串口助手

串口助手 前言一、ui设计二、ui的控件命名三、ui转py使用类的方法【扩展】使用ui文件导入&#xff01;P7的小错误解决办法 总结 前言 我的惯例就是万物之始&#xff0c;拜见吾师&#x1f970;⇨pyqt串口合集 最开始的时候我想的是&#xff0c;学了那么久的pyqt&#xff0c;我…

论文学习 StarGANv2 ——StarGAN v2: Diverse Image Synthesis for Multiple Domains

多领域不同图像合成 We have made dataset available at https://github.com/clovaai/stargan-v2. 摘要&#xff1a; 一个好的图像到图像转换模型应该学习不同视觉域之间的映射&#xff0c;同时满足以下属性: 1)生成图像的多样性 2)在多个域上的可扩展性。 现有的方法解决…

PFC电路中MOS管的选取3

MOS管的驱动波形 一个 MOS管在开通或者关断的时候&#xff0c;必定会经历一个线性区。这个线性区域在 Vgs波形上表现出一个平台&#xff0c;在这个平台的时候电流和电压的变化率是很大的&#xff0c;有很大的 dv/dt&#xff0c;di/dt &#xff0c;由于 di/dt变化非常大&#xf…

一、Qemu调试内核

一、安装Qemu 1、安装Qemu sudo apt install qemu-system-arm2、测试版本 qemu-system-arrch -version二、编译内核 1、下载内核 https://mirrors.edge.kernel.org/pub/linux/kernel2、编译内核 &#xff08;1&#xff09;配置架构和编译器 ARCH ? $(SUBARCH)ARCH :…

【java计算机毕设】学生项目竞赛管理系统 MySQL ssm JSP maven小组项目设计代码源码+万字文档

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】学生项目竞赛管理系统 MySQL ssm JSP maven小组项目设计代码源码万字文档 2项目介绍 系统功能&#xff1a; 学生项目竞赛管理系统包括管理员、用户、教师三种角色。 管理员功能包括个人中心模块用于修改个…

ArcGIS Pro SDK (八)地理数据库 5 编辑

ArcGIS Pro SDK &#xff08;八&#xff09;地理数据库 5 编辑 文章目录 ArcGIS Pro SDK &#xff08;八&#xff09;地理数据库 5 编辑1 创建行2 创建要素3 修改行4 修改要素5 将值写入 Guid 列6 删除行/要素7 添加附件8 更新附件9 删除附件10 写入 Blob 字段11 读取 Blob 字段…

Perl高手秘籍:自定义操作符的炼金术

&#x1f31f; Perl高手秘籍&#xff1a;自定义操作符的炼金术 Perl是一种极其灵活的编程语言&#xff0c;它不仅支持内置的操作符&#xff0c;还允许开发者定义自己的操作符。自定义操作符可以极大地增强Perl代码的表达力和功能性。本文将深入探讨如何在Perl中定义自定义操作…

一位互联网公司项目经理繁忙的一天

早晨&#xff1a;准备与计划 7:00 AM - 起床与准备 项目经理起床后&#xff0c;快速洗漱并享用早餐。之后花几分钟查看手机上的邮件和消息&#xff0c;确保没有紧急事务需要立即处理。 7:30 AM - 通勤时间 前往公司。在通勤途中&#xff0c;通过手机或平板电脑查看当天的会议…

Java多线程面试题

目录 一.线程和进程的区别 二.保证线程安全的手段 三.创建多线程的方式 四.线程池的讲解 五.volatile和synchronzied的区别 六.synchronized 和 Lock的区别 七.产生死锁的条件 八.Java当中常见的锁策略 本专栏全是博主自己收集的面试题&#xff0c;仅可参考…

C基础day8

一、思维导图 二、课后习题 #include<myhead.h> #define Max_Stu 100 //函数声明 //学生信息录入函数 void Enter_stu(int *Num_Stu,char Stu_name[][50],int Stu_score[]); //查看学生信息 void Print_stu(int Num_Stu,char Stu_name[][50],int Stu_score[]); //求出成绩…

运维锅总详解进程、内核线程、用户态线程和协程

I/O 密集型应用、计算密集型应用应该用什么实现&#xff1f;进程、内核线程、用户态线程、协程它们的原理和应用场景又是什么&#xff1f;如何组合它们才能让机器性能达到最优&#xff1f;它们的死锁和竞态又是什么&#xff1f;如何清晰地表示它们之间的关系&#xff1f;希望读…

红日靶场----(三)2.漏洞利用

上期的通过一句话木马实现对目标主机的持久后门 我使用的是蚁剑&#xff0c;蚁剑安装及使用参考&#xff1a; 下载地址&#xff1a; GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 安装即使用&#xff1a; 1. 快速入门 语雀 通过YXCMS的后台GETSHELL 利用…

Dify工作流中的变量聚合节点

一.定义 变量聚合节点&#xff08;原变量赋值节点&#xff09;负责整合不同分支的输出结果&#xff0c;确保无论哪个分支被执行&#xff0c;其结果都能通过一个统一的变量来引用和访问。这在多分支的情况下非常有用&#xff0c;可将不同分支下相同作用的变量映射为一个输出变量…

剖析自闭症孩子玩手的独特之处

自闭症孩子玩手的行为常常具有一些较为独特的特点。 重复性是一个显著的特征。他们可能会以一种几乎相同的方式、节奏和频率反复地摆弄自己的手&#xff0c;例如不停地握拳、张开&#xff0c;或者持续地旋转手腕。 动作的单调性也是常见的。玩手的方式可能较为单一&#xff0c;…

力扣 24两两交换链表中节点

画图 注意有头结点 注意判断时先判断cur->next ! nullptr,再判断cur->next->next ! nullptr 注意末尾返回dumyhead->next&#xff0c;用新建result指针来接并返回 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode *dummyhead new List…

java线程介绍

Java 线程是指程序中的一个独立执行路径。使用多线程编程可以实现并发,从而使程序可以同时执行多个任务。Java 提供了强大的线程支持,使得开发多线程应用程序变得相对简单。以下是对 Java 线程的详细介绍,包括基本概念、创建和管理线程的方法,以及常见的使用场景和注意事项…

小技巧(更新中)

1.Pycharm使用小技巧pycharm的使用小技巧1---快速找到模块内的函数和类&#xff0c;快速定位查看的模块所在位置_pycharm怎么查找某个函数-CSDN博客 2. Python库之requirments Python库安装之requirements.txt, environment.yml_python requirements-CSDN博客 3.执行.sh脚本的…