C++实现有限状态机

本文介绍了使用C++实现有限状态机的过程,包括有限状态机的四大要素:现态、次态、动作和条件,并通过学生日常生活的状态转移案例,详细讲解了如何用函数指针实现状态转移。作者首先绘制状态转移图,然后创建FSMItem类表示状态和事件,接着创建FSM类用于管理状态转移,并进行了测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:因为最近打算学设计模式的状态模式,但不是很明白有限状态机和状态模式之间的关系,索性用C++实现了一个简单案例复习了一下FSM,如果有更好的实现方法,欢迎留言

有限状态机四大要素

  • 现态:当前所处状态
  • 次态:当条件满足后,即将转移的下一个状态
  • 动作:当满足某个事件时执行的动作;动作执行完毕后可以转移到另一个状态或保持原有状态
  • 条件:转移状态所需的条件,当满足条件时,会触发一个动作或进行状态转移

C++函数指针实现

案例:学生的日常生活。

  • 学生的日常生活包含以下几个状态:起床、上学、吃午饭、做作业、睡觉;
  • 每个状态之间进行转移需要执行相应的事件。

我分为以下几个步骤来实现:

  • (1)绘制状态转移图
  • (2)创建状态转移的FSMItem类
    • 枚举:所有状态State、所有事件Event
    • 成员变量:现态_curState、事件_event、次态_nextState
    • 成员函数:动作函数
  • (3)创建有限状态机FSM类
    • 成员变量:状态转移表vector<FSMItem*> _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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值