c++写状态机

用c++的状态模式写状态机
状态是固定的,事件可扩展
由事件触发,然后根据状态有不同的处理

状态表

空闲对接中对接成功对接失败补给中补给成功补给失败停止补给中停止补给成功停止补给失败断开对接中
对接事件
断开对接事件
补给事件
停止补给事件

代码
fsm.h

#ifndef FSM_H
#define FSM_H

#include <unordered_map>

// 事件
enum {
     CONNECT_EVENT     = 1,             // 连接事件
     DISCONNECT_EVENT  = 2,             // 断开连接
     SUPPLY_EVENT      = 3,             // 补给事件
     STOP_SUPPLY_EVENT = 4,             // 停止补给
};

// 状态
enum {
    IDLE_STATE = 0,                     // 空闲
    
    CONNECTING_STATE,                   // 对接中
    CONNECT_SUCCESS_STATE,              // 对接成功
    CONNECT_FAIL_STATE,                 // 对接失败

    SUPPLYING_STATE,                    // 补给中
    SUPPLY_SUCCESS_STATE,               // 补给成功
    SUPPLY_FAIL_STATE,                  // 补给失败

    STOP_SUPPLYING_STATE,               // 停止补给中
    STOP_SUPPLY_SUCCESS_STATE,          // 停止补给成功
    STOP_SUPPLY_FAIL_STATE,             // 停止补给失败

    DISCONNECTING_STATE,                // 断开对接中
};

class Event;

// FSM类管理事件处理
// 事件类管理状态处理
class FSM
{
public:
    bool RegisterEvent(int event, Event *pEvent);       // 注册新的事件
    bool StateTrans(int newState);                      // 需要状态转移则调用此函数
    void EventTick(int event);                          // 根据事件,调用对应的事件类处理函数去处理
    int GetCurState();                                  // 获取当前状态
    void SetInitState(int state);                       // 设置初始状态

private:
    std::unordered_map<int, Event*> all_event;          // 参数1事件,参数2对应事件类
    int cur_state;                                      // 当前状态
};

// 事件的基类
class Event
{
public:
    
    
    virtual void init() = 0;
    virtual void OnEventEnter() = 0;                        
    virtual void OnEventHandle(int cur_state) = 0;
    virtual void OnEventExit() = 0;
    Event(FSM *_fsm)
    {
        fsm = _fsm;
    }
protected:
    FSM* fsm = nullptr;
};
#endif // FSM_H

fsm.cpp

#include "fsm.h"

// 注册新的事件
bool FSM::RegisterEvent(int event, Event *pEvent)
{
    all_event[event] = pEvent;
    return true;
}

// 需要状态转移则调用此函数
bool FSM::StateTrans(int newState)
{
    cur_state = newState;
    return true;
}

// 根据事件,调用对应的事件类处理函数去处理
void FSM::EventTick(int event)
{
    all_event[event]->OnEventHandle(cur_state);
}

// 获取当前状态
int FSM::GetCurState()
{
    return cur_state;
}

// 设置初始状态
void FSM::SetInitState(int state)
{
    cur_state = state;
}

event_connect.h

#ifndef EVENT_CONNECT_H
#define EVENT_CONNECT_H

#include "fsm.h"

// 连接事件
class ConnectEvent : public Event
{
public:
    ConnectEvent(FSM* fsm);
    void init();                                                    // 初始化,对应状态和处理函数的映射

    int connect();
    int connecting();
    int connect_success();

    void OnEventEnter();
    void OnEventHandle(int cur_state);
    void OnEventExit();

private:
    std::unordered_map<int, int(ConnectEvent::*)()> e_state;        // 参数1是状态,参数2是处理函数
};

// 断开连接事件
class DisconnectEvent : public Event
{
public:
    DisconnectEvent(FSM* fsm);
    void init();                                                    // 初始化,对应状态和处理函数的映射

    int disconnect();
    int disconnecting();
    int disconnect_success();

    void OnEventEnter();
    void OnEventHandle(int cur_state);
    void OnEventExit();

private:
    std::unordered_map<int, int(DisconnectEvent::*)()> e_state;     // 参数1是状态,参数2是处理函数
};

#endif // EVENT_CONNECT_H

event_connect.cpp

#include <iostream>
#include <unistd.h>
#include "event_connect.h"

using namespace std;

ConnectEvent::ConnectEvent(FSM* fsm) : Event(fsm) 
{
    init();
}

// 初始化,对应状态和处理函数的映射
void ConnectEvent::init()
{
    e_state[IDLE_STATE]                 = &ConnectEvent::connect;
    e_state[CONNECTING_STATE]           = &ConnectEvent::connecting;
    e_state[CONNECT_SUCCESS_STATE]      = &ConnectEvent::connect_success;
    e_state[CONNECT_FAIL_STATE]         = &ConnectEvent::connect;
    e_state[SUPPLYING_STATE]            = &ConnectEvent::connect_success;
    e_state[SUPPLY_SUCCESS_STATE]       = &ConnectEvent::connect_success;
    e_state[SUPPLY_FAIL_STATE]          = &ConnectEvent::connect_success;
    e_state[STOP_SUPPLYING_STATE]       = &ConnectEvent::connect_success;
    e_state[STOP_SUPPLY_SUCCESS_STATE]  = &ConnectEvent::connect_success;
    e_state[STOP_SUPPLY_FAIL_STATE]     = &ConnectEvent::connect_success;
    e_state[DISCONNECTING_STATE]        = &ConnectEvent::connect_success;
}

// 连接处理
int ConnectEvent::connect()
{   
    cout << "connect start" << endl;
    fsm->StateTrans(CONNECTING_STATE);
    sleep(3);
    fsm->StateTrans(CONNECT_SUCCESS_STATE);
    cout << "connect success" << endl;
    return 0;
}

// 连接中处理
int ConnectEvent::connecting()
{
    cout << "connecting" << endl;
    return 0;
}

// 连接成功处理
int ConnectEvent::connect_success()
{
    cout << "connect_success" << endl;
    return 0;
}

// 事件资源申请处理
void ConnectEvent::OnEventEnter() 
{
    cout << "---- ConnectEvent Enter" << endl;
}

// 事件处理
void ConnectEvent::OnEventHandle(int cur_state) 
{
    cout << "OnEventHandle cur state: " << cur_state << endl;
    OnEventEnter();

    (this->*e_state[cur_state])();                  // 不加this会编译出错

    OnEventExit();
    return ;  
}

// 事件资源释放处理
void ConnectEvent::OnEventExit() 
{ 
    cout << "==== ConnectEvent Exit" << endl; 
}





DisconnectEvent::DisconnectEvent(FSM* fsm) : Event(fsm) 
{
    init();
}

// 初始化,对应状态和处理函数的映射
void DisconnectEvent::init()
{
    e_state[IDLE_STATE]                 = &DisconnectEvent::disconnect_success;
    e_state[CONNECTING_STATE]           = &DisconnectEvent::disconnect;
    e_state[CONNECT_SUCCESS_STATE]      = &DisconnectEvent::disconnect;
    e_state[CONNECT_FAIL_STATE]         = &DisconnectEvent::disconnect_success;
    e_state[SUPPLYING_STATE]            = &DisconnectEvent::disconnect;
    e_state[SUPPLY_SUCCESS_STATE]       = &DisconnectEvent::disconnect;
    e_state[SUPPLY_FAIL_STATE]          = &DisconnectEvent::disconnect;
    e_state[STOP_SUPPLYING_STATE]       = &DisconnectEvent::disconnect;
    e_state[STOP_SUPPLY_SUCCESS_STATE]  = &DisconnectEvent::disconnect;
    e_state[STOP_SUPPLY_FAIL_STATE]     = &DisconnectEvent::disconnect;
    e_state[DISCONNECTING_STATE]        = &DisconnectEvent::disconnecting;
}

// 断开连接处理
int DisconnectEvent::disconnect()
{   
    cout << "disconnect start" << endl;
    fsm->StateTrans(DISCONNECTING_STATE);
    sleep(3);
    fsm->StateTrans(IDLE_STATE);
    cout << "disconnect success" << endl;
    return 0;
}

// 断开连接中处理
int DisconnectEvent::disconnecting()
{
    cout << "disconnecting" << endl;
    return 0;
}

// 断开连接成功处理
int DisconnectEvent::disconnect_success()
{
    cout << "disconnect_success" << endl;
    return 0;
}

// 事件资源申请处理
void DisconnectEvent::OnEventEnter() 
{
    cout << "---- DisconnectEvent Enter" << endl;
}

// 事件处理
void DisconnectEvent::OnEventHandle(int cur_state) 
{
    cout << "OnEventHandle cur state: " << cur_state << endl;
    OnEventEnter();

    (this->*e_state[cur_state])();                  // 不加this会编译出错

    OnEventExit();
    return ;  
}

// 事件资源释放处理
void DisconnectEvent::OnEventExit() 
{ 
    cout << "==== DisconnectEvent Exit" << endl; 
}

event_supply.h

#ifndef EVENT_SUPPLY_H
#define EVENT_SUPPLY_H

#include "fsm.h"

// 补给事件
class SupplyEvent : public Event
{
public:
    SupplyEvent(FSM* fsm);
    void init();                                                    // 初始化,对应状态和处理函数的映射

    int supply();
    int supplying();
    int supply_success();
    int not_allow_supply();

    void OnEventEnter();
    void OnEventHandle(int cur_state);
    void OnEventExit();

private:
    std::unordered_map<int, int(SupplyEvent::*)()> e_state;         // 参数1是状态,参数2是处理函数
};

// 停止补给事件
class StopSupplyEvent : public Event
{
public:
    StopSupplyEvent(FSM* fsm);
    void init();                                                    // 初始化,对应状态和处理函数的映射

    int stop_supply();
    int stop_supplying();
    int stop_supply_success();
    int not_allow_stop_supply();

    void OnEventEnter();
    void OnEventHandle(int cur_state);
    void OnEventExit();

private:
    std::unordered_map<int, int(StopSupplyEvent::*)()> e_state;     // 参数1是状态,参数2是处理函数
};

#endif // EVENT_SUPPLY_H

event_supply.cpp

#include <iostream>
#include <unistd.h>
#include "event_supply.h"

using namespace std;

SupplyEvent::SupplyEvent(FSM* fsm) : Event(fsm) 
{
    init();
}

// 初始化,对应状态和处理函数的映射
void SupplyEvent::init()
{
    e_state[IDLE_STATE]                 = &SupplyEvent::not_allow_supply;
    e_state[CONNECTING_STATE]           = &SupplyEvent::not_allow_supply;
    e_state[CONNECT_SUCCESS_STATE]      = &SupplyEvent::supply;
    e_state[CONNECT_FAIL_STATE]         = &SupplyEvent::not_allow_supply;
    e_state[SUPPLYING_STATE]            = &SupplyEvent::supplying;
    e_state[SUPPLY_SUCCESS_STATE]       = &SupplyEvent::supply_success;
    e_state[SUPPLY_FAIL_STATE]          = &SupplyEvent::supply;
    e_state[STOP_SUPPLYING_STATE]       = &SupplyEvent::not_allow_supply;
    e_state[STOP_SUPPLY_SUCCESS_STATE]  = &SupplyEvent::supply_success;
    e_state[STOP_SUPPLY_FAIL_STATE]     = &SupplyEvent::supply;
    e_state[DISCONNECTING_STATE]        = &SupplyEvent::not_allow_supply;
}

// 补给处理
int SupplyEvent::supply()
{   
    cout << "supply start" << endl;
    fsm->StateTrans(SUPPLYING_STATE);
    sleep(3);
    fsm->StateTrans(SUPPLY_SUCCESS_STATE);
    cout << "supply success" << endl;
    return 0;
}

// 补给中处理
int SupplyEvent::supplying()
{
    cout << "supplying" << endl;
    return 0;
}

// 补给成功处理
int SupplyEvent::supply_success()
{
    cout << "supply_success" << endl;
    return 0;
}

// 不能补给处理
int SupplyEvent::not_allow_supply()
{
    cout << "not_allow_supply" << endl;
    return 0;
}

// 事件资源申请处理
void SupplyEvent::OnEventEnter() 
{
    cout << "---- SupplyEvent Enter" << endl;
}

// 事件处理
void SupplyEvent::OnEventHandle(int cur_state) 
{
    cout << "OnEventHandle cur state: " << cur_state << endl;
    OnEventEnter();

    (this->*e_state[cur_state])();                  // 不加this会编译出错

    OnEventExit();
    return ;  
}

// 事件资源释放处理
void SupplyEvent::OnEventExit() 
{ 
    cout << "==== SupplyEvent Exit" << endl; 
}




StopSupplyEvent::StopSupplyEvent(FSM* fsm) : Event(fsm) 
{
    init();
}

// 初始化,对应状态和处理函数的映射
void StopSupplyEvent::init()
{
    e_state[IDLE_STATE]                 = &StopSupplyEvent::not_allow_stop_supply;
    e_state[CONNECTING_STATE]           = &StopSupplyEvent::not_allow_stop_supply;
    e_state[CONNECT_SUCCESS_STATE]      = &StopSupplyEvent::not_allow_stop_supply;
    e_state[CONNECT_FAIL_STATE]         = &StopSupplyEvent::not_allow_stop_supply;
    e_state[SUPPLYING_STATE]            = &StopSupplyEvent::stop_supply;
    e_state[SUPPLY_SUCCESS_STATE]       = &StopSupplyEvent::stop_supply;
    e_state[SUPPLY_FAIL_STATE]          = &StopSupplyEvent::stop_supply;
    e_state[STOP_SUPPLYING_STATE]       = &StopSupplyEvent::stop_supplying;
    e_state[STOP_SUPPLY_SUCCESS_STATE]  = &StopSupplyEvent::stop_supply_success;
    e_state[STOP_SUPPLY_FAIL_STATE]     = &StopSupplyEvent::stop_supply;
    e_state[DISCONNECTING_STATE]        = &StopSupplyEvent::not_allow_stop_supply;
}

// 补给处理
int StopSupplyEvent::stop_supply()
{   
    cout << "stop_supply start" << endl;
    fsm->StateTrans(STOP_SUPPLYING_STATE);
    sleep(3);
    fsm->StateTrans(STOP_SUPPLY_SUCCESS_STATE);
    cout << "stop_supply success" << endl;
    return 0;
}

// 补给中处理
int StopSupplyEvent::stop_supplying()
{
    cout << "stop_supplying" << endl;
    return 0;
}

// 补给成功处理
int StopSupplyEvent::stop_supply_success()
{
    cout << "stop_supply_success" << endl;
    return 0;
}

// 不能补给处理
int StopSupplyEvent::not_allow_stop_supply()
{
    cout << "not_allow_supply" << endl;
    return 0;
}

// 事件资源申请处理
void StopSupplyEvent::OnEventEnter() 
{
    cout << "---- StopSupplyEvent Enter" << endl;
}

// 事件处理
void StopSupplyEvent::OnEventHandle(int cur_state) 
{
    cout << "OnEventHandle cur state: " << cur_state << endl;
    OnEventEnter();

    (this->*e_state[cur_state])();                  // 不加this会编译出错

    OnEventExit();
    return ;  
}

// 事件资源释放处理
void StopSupplyEvent::OnEventExit() 
{ 
    cout << "==== StopSupplyEvent Exit" << endl; 
}

main.cpp

/************************************************************************************
* 状态是固定的,事件是可扩展的
* 状态模式实现状态机
* 状态机类管理状态转换,以及状态处理调用
* 事件业务逻辑处理类
* 
*                 空闲  对接中  对接成功  对接失败  补给中  补给成功  补给失败  停止补给中  停止补给成功  停止补给失败  断开对接中
* 对接事件
* 断开对接事件
* 补给事件
* 停止补给事件
*************************************************************************************/

#include <iostream>

#include "event_connect.h"
#include "event_supply.h"

int main()
{
    // 构造状态机
    FSM* fsm = new FSM();
    fsm->SetInitState(IDLE_STATE);

    Event* connect_e = new ConnectEvent(fsm);
    Event* disconnect_e = new DisconnectEvent(fsm);
    Event* supply_e = new SupplyEvent(fsm);
    Event* stop_supply_e = new StopSupplyEvent(fsm);

    fsm->RegisterEvent(CONNECT_EVENT, connect_e);
    fsm->RegisterEvent(DISCONNECT_EVENT, disconnect_e);
    fsm->RegisterEvent(SUPPLY_EVENT, supply_e);
    fsm->RegisterEvent(STOP_SUPPLY_EVENT, stop_supply_e);

    fsm->EventTick(CONNECT_EVENT);
    fsm->EventTick(CONNECT_EVENT);
    fsm->EventTick(SUPPLY_EVENT);
    fsm->EventTick(STOP_SUPPLY_EVENT);

    fsm->EventTick(DISCONNECT_EVENT);

    std::cout << "cur state: " << fsm->GetCurState() << std::endl;

    return 0;
}

Makefile

all : main.o fsm.o event_connect.o event_supply.o
	g++ -std=c++11 -o main -I ./ main.o fsm.o event_connect.o event_supply.o

main.o : main.cpp
	g++ -std=c++11 -c -I ./ main.cpp
fsm.o : fsm.cpp 
	g++ -std=c++11 -c fsm.cpp
event_connect.o : event_connect.cpp 
	g++ -std=c++11 -c -I ./ event_connect.cpp
event_supply.o : event_supply.cpp 
	g++ -std=c++11 -c -I ./ event_supply.cpp

clean : 
	rm -f *.o main 

执行结果打印
在这里插入图片描述

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的状态机示例,它将字符串解析为整数,并根据输入字符切换状态。 ```c typedef enum { STATE_START, // 初始状态 STATE_INT, // 数字状态 STATE_END, // 结束状态 STATE_ERROR // 错误状态 } State; int str_to_int(const char *str) { State state = STATE_START; int result = 0; int sign = 0; while (*str != '\0') { char c = *str++; switch (state) { case STATE_START: if (c == '+') { sign = 1; state = STATE_INT; } else if (c == '-') { sign = -1; state = STATE_INT; } else if (isdigit(c)) { result = c - '0'; state = STATE_INT; } else if (isspace(c)) { // 无操作 } else { state = STATE_ERROR; } break; case STATE_INT: if (isdigit(c)) { result = result * 10 + (c - '0'); } else if (isspace(c)) { state = STATE_END; } else { state = STATE_ERROR; } break; default: state = STATE_ERROR; break; } } return (state == STATE_END) ? result * sign : 0; } ``` 代码通过 `switch` 语句实现状态转移,并使用枚举常量定义状态。在 `STATE_START` 状态下,代码将读取输入字符,如果是 `+`、`-` 和数字,它将设置符号和结果,并进入 `STATE_INT` 状态。如果输入字符是空格,则状态转移到下一个字符。在 `STATE_INT` 状态下,代码将读取输入字符,如果是数字,则更新结果,否则退出循环。如果输入字符是空格,则将状态设置为 `STATE_END`,结束循环。如果输入不是数字或空格,则将状态设置为 `STATE_ERROR`。最后,如果状态为 `STATE_END`,则返回结果和符号的乘积,否则返回 0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值