C++ 有限状态机

用一个类定义事件和状态
文件:GlobalAutoDcl.h
Const int NbMaxAction =10;
Const int NbMaxState =5;
Const int NbMaxEvent =6;
Class GlobalAutoDcl{
public:
typedef enum {
event0 = 0;
event1 =1;
.......
}
typedef enum {
state0  = 0;
state1   =1;
.......
}
}
用一个抽象类定义一些数组,Action等:
文件: GlobalAuto.h
class GlobalResetAuto{
public:
protected:
//定义action的函数指针类型
typedef GlobalAutoDcl::StateForGlobalReset_t 
(GlobalAuto::*fPtr) (Signal *);
//定义一个Action的表
static fPtr ActionTable[NbMaxAction];
// 定义一个state/event的二维数组
static unsigned char Automaton[NbMaxState ][NbMaxEvent];
//二维数组的值就是Action,对应的state,event
// 定义虚函数,也就是Action函数
// 注意函数名字定义,由state和event组成,表示这个action是在此state下收到此event
virtual GlobalAutoDcl::State_t  state1_event2(Signal *msg) =0;
virtual GlobalAutoDcl::State_t  state3_event5(Signal *msg) =0;
// 此类中通常还包括如下方法定义
//  1.  返回当前state
//   2. 把当前state和event转换成字符串
//   3. ActionTable的初始化调用函数
//    4. 初始化Action数组的函数(也可以不放这里)
}
在globalauto.h文件中方法的具体实现
文件: globalauto.cpp
// 上面的state/event数组可以放在这里初始化
// Action也可以放在这里初始化
// 通常还会增加debug功能,记录过去发生的event
// 一个接收input signal的函数, 传进来的event应该包含event, 而state是本地有的
// 然后调用action中的函数指针,更改新state

转载于:https://www.cnblogs.com/JeffChen/archive/2012/03/08/2600247.html

### 如何用 C++ 实现有限状态机 以下是基于提供的引用内容以及专业知识,详细介绍如何通过 C++ 来实现一个有限状态机(Finite State Machine, FSM),并提供完整的代码示例。 #### 1. 有限状态机的核心概念 有限状态机由四个主要部分组成:一组状态、初始状态、输入集合和转换函数[^1]。这些组成部分可以通过面向对象编程的方式在 C++ 中表示出来。具体来说: - **状态** 可以被定义为抽象类 `State` 的派生子类。 - **上下文 (Context)** 是用于管理当前状态的对象。 - **事件触发器** 负责调用状态间的切换逻辑。 #### 2. 设计思路 为了清晰地展示 FSM 的工作原理,可以采用以下结构: - 定义一个抽象基类 `State`,其中包含处理逻辑的纯虚函数 `handle()`。 - 创建具体的子类继承自 `State`,分别对应不同的状态。 - 使用 `Context` 类来保存当前状态,并允许外部请求改变其内部状态。 #### 3. 示例代码 下面是一个关于学生日常生活的简单 FSM 实现: ```cpp #include <iostream> using namespace std; // 抽象状态类 class State { public: virtual ~State() {} virtual void handle(Context& context) = 0; }; // 上下文类 class Context { private: State* currentState; public: Context(State* initialState) : currentState(initialState) {} void setState(State* newState) { delete currentState; currentState = newState; } void request() { if (currentState != nullptr) { currentState->handle(*this); } } ~Context() { delete currentState; } }; // 具体状态A - 起床 class WakeUp : public State { public: void handle(Context& context) override { cout << "Wake up and get ready for school." << endl; context.setState(new GoToSchool()); } }; // 具体状态B - 去学校 class GoToSchool : public State { public: void handle(Context& context) override { cout << "Go to school and attend classes." << endl; context.setState(new HaveLunch()); } }; // 具体状态C - 吃午饭 class HaveLunch : public State { public: void handle(Context& context) override { cout << "Have lunch at the cafeteria." << endl; context.setState(new DoHomework()); } }; // 具体状态D - 写作业 class DoHomework : public State { public: void handle(Context& context) override { cout << "Do homework after returning home." << endl; context.setState(new Sleep()); } }; // 具体状态E - 睡觉 class Sleep : public State { public: void handle(Context& context) override { cout << "Sleep well tonight!" << endl; // 不再设置新状态,结束流程 } }; int main() { // 初始化状态为起床 State* wakeUpState = new WakeUp(); // 创建上下文对象 Context student(wakeUpState); // 执行一系列状态变化 while (true) { student.request(); // 请求状态处理 if (dynamic_cast<Sleep*>(student.getCurrentState())) break; // 如果已经是睡觉状态,则退出循环 } return 0; } ``` 上述程序模拟了一名学生的典型一天活动顺序,从起床到最终入睡的过程[^2]。 #### 4. 关键点解析 - **状态切换机制**: 当前状态下完成操作后会主动通知 `Context` 更改至下一个目标状态。 - **动态绑定特性**: 利用了多态性使得不同类型的实例能够响应相同的接口调用。 - **资源释放考虑**: 析构函数中加入了清理内存的操作以防泄漏。 #### 5. 结合其他设计模式的可能性 如果希望进一步增强灵活性或者扩展功能范围的话,还可以尝试融合行为树(Behavior Tree)[^5]或者其他高级架构理念比如策略模式(Strategic Pattern),从而构建更加复杂而强大的控制系统。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值