如何实现C++有限状态机
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"如何实现C++有限状态机",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现C++有限状态机"吧!目录有限状态机四大要素C++函数指针
千家信息网最后更新 2026年11月02日如何实现C++有限状态机
本篇内容主要讲解"如何实现C++有限状态机",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现C++有限状态机"吧!
目录
有限状态机四大要素
C++函数指针实现
有限状态机四大要素
现态:当前所处状态
次态:当条件满足后,即将转移的下一个状态
动作:当满足某个事件时执行的动作;动作执行完毕后可以转移到另一个状态或保持原有状态
条件:转移状态所需的条件,当满足条件时,会触发一个动作或进行状态转移
C++函数指针实现
案例:学生的日常生活。
学生的日常生活包含以下几个状态:起床、上学、吃午饭、做作业、睡觉;
每个状态之间进行转移需要执行相应的事件。
我分为以下几个步骤来实现:
(1)绘制状态转移图
(2)创建状态转移的FSMItem类
枚举:所有状态State、所有事件Event;
成员变量:现态_curState、事件_event、次态_nextState
成员函数:动作函数
(3)创建有限状态机FSM类
成员变量:状态转移表vector
_fsmTable 成员函数:初始化状态转移表、状态转移、根据事件执行相应动作
(4)测试FSM
(1)绘制状态转移图
(2)FSMItem类
//FSM状态项class FSMItem{ friend class FSM;private: //动作函数 static void getUp() { cout << "student is getting up!" << endl; } static void go2School() { cout << "student is going to school!" << endl; } static void haveLunch() { cout << "student is having lunch!" << endl; } static void doHomework() { cout << "student is doing homework!" << endl; } static void sleeping() { cout << "student is sleeping!" << endl; }public: //枚举所有状态 enum State { GETUP = 0, GOTOSCHOOL, HAVELUNCH, DOHOMEWORK, SLEEP }; //枚举所有事件 enum Events { EVENT1 = 0, EVENT2, EVENT3 };public: //初始化构造函数 FSMItem(State curState, Events event, void(*action)(), State nextState) :_curState(curState), _event(event), _action(action), _nextState(nextState) {}private: State _curState; //现态 Events _event; //条件 void (*_action)(); //动作 State _nextState; //次态};(3)FSM类
class FSM{public: //初始化状态机 FSM(FSMItem::State curState= FSMItem::GETUP):_curState(curState) { initFSMTable(); } //状态转移 void transferState(FSMItem::State nextState) { _curState = nextState; } //根据当前状态和发生的事件,执行相应的动作,并进行状态转移 void handleEvent(FSMItem::Events event) { FSMItem::State curState = _curState; //现态 void (*action)() = nullptr;//动作 FSMItem::State nextState; //次态 bool flag = false; for (int i = 0; i < _fsmTable.size(); i++) { if (event == _fsmTable[i]->_event && curState == _fsmTable[i]->_curState) { flag = true; action = _fsmTable[i]->_action; nextState = _fsmTable[i]->_nextState; break; } } //找到对应的状态项,执行动作,转移状态 if (flag) { if (action) { action(); } transferState(nextState); } }private: //根据画的状态转移图初始化状态转移表 void initFSMTable() { _fsmTable.push_back(new FSMItem(FSMItem::GETUP, FSMItem::EVENT1, &FSMItem::getUp, FSMItem::GOTOSCHOOL)); _fsmTable.push_back(new FSMItem(FSMItem::GOTOSCHOOL, FSMItem::EVENT2, &FSMItem::go2School, FSMItem::HAVELUNCH)); _fsmTable.push_back(new FSMItem(FSMItem::HAVELUNCH, FSMItem::EVENT3, &FSMItem::haveLunch, FSMItem::DOHOMEWORK)); _fsmTable.push_back(new FSMItem(FSMItem::DOHOMEWORK, FSMItem::EVENT1, &FSMItem::doHomework, FSMItem::SLEEP)); _fsmTable.push_back(new FSMItem(FSMItem::SLEEP, FSMItem::EVENT2, &FSMItem::sleeping, FSMItem::GETUP)); }public: FSMItem::State _curState; //现态private: vector _fsmTable; //状态转移表}; (4)测试FSM
#include#include using namespace std;//测试事件变换void testEvent(FSMItem::Events& event){ switch (event) { case FSMItem::EVENT1: event = FSMItem::EVENT2; break; case FSMItem::EVENT2: event = FSMItem::EVENT3; break; case FSMItem::EVENT3: event = FSMItem::EVENT1; break; }}int main(){ FSM *fsm = new FSM(); auto event = FSMItem::EVENT1; while (1) { cout << "event " << event << " is coming..." << endl; fsm->handleEvent(event); cout << "fsm current state is " << fsm->_curState << endl; testEvent(event); } return 0;}
到此,相信大家对"如何实现C++有限状态机"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
状态
动作
事件
函数
有限
C++
条件
成员
测试
内容
变量
学生
指针
要素
学习
生活
实用
更深
之间
兴趣
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
华服互联网科技怎么样
广州紫鲸互联网科技有限公司
互联网科技产业
新华互联网科技学校
互联网科技与金融科技
互联网科技的发展
互联网科技金融公司
互联网科技股票
互联网科技公司官网
互联网科技logo
中国最先进互联网科技公司
互联网科技公司招聘
中国科技互联网公司收入
恒银科技与互联网金融
千方科技属于互联网企业吗
如何创新互联网科技
第三届互联网大会安防黑科技
恒生科技指数 中概互联网
山东蛋芒互联网科技有限公司
恒生科技互联网指数十大成分股
湖南永感互联网科技有限公司
万易互联网科技
互联网与新科技
迪茉互联网科技
常德市电业局互联网科技部
厦门比较好的科技互联网公司
移动互联网科技公司
35岁以上互联网科技行业
北京互联网科技类企业分布
易租星互联网科技有限公司