
实现一个简单的有限状态机(Finite State machine, FSM)在C++中可以通过类和状态转移表的方式完成。核心思路是将状态和事件抽象出来,通过映射关系决定状态如何迁移,并在进入或退出状态时执行相应动作。
定义状态与事件
首先明确系统有哪些状态和事件。比如设计一个简单的灯控系统:
- 状态:关(OFF)、开(ON)
- 事件:按下开关(TOGGLE)
可以用枚举来表示:
enum class State { OFF, ON }; enum class Event { TOGGLE };
设计状态机类
创建一个FSM类,维护当前状态,并提供处理事件的接口。状态转移逻辑可以放在一个查找表中。
立即学习“C++免费学习笔记(深入)”;
#include <iostream> #include <map> class LightFSM { public: LightFSM() : currentState(State::OFF) {} void handleEvent(Event e) { auto it = transitions.find({currentState, e}); if (it != transitions.end()) { State newState = it->second; exitAction(currentState); currentState = newState; entryAction(currentState); } else { std::cout << "No valid transition from current state for this event.n"; } } private: State currentState; // 状态转移表:{当前状态, 事件} -> 下一状态 std::map<std::pair<State, Event>, State> transitions = { {{State::OFF, Event::TOGGLE}, State::ON}, {{State::ON, Event::TOGGLE}, State::OFF} }; // 进入状态时的动作 void entryAction(State s) { if (s == State::ON) { std::cout << "Light is ON.n"; } else if (s == State::OFF) { std::cout << "Light is OFF.n"; } } // 退出状态时的动作 void exitAction(State s) { if (s == State::ON) { std::cout << "Turning light OFF...n"; } } };
使用示例
在main函数中创建状态机实例并触发事件:
int main() { LightFSM light; light.handleEvent(Event::TOGGLE); // 输出:Turning light OFF... Light is ON. light.handleEvent(Event::TOGGLE); // 输出:Turning light OFF... Light is OFF. light.handleEvent(Event::TOGGLE); // 输出:Light is ON. return 0; }
这个实现方式结构清晰,易于扩展。如果需要支持更多状态和事件,只需更新枚举和转移表。动作逻辑也可以封装成函数指针或std::function,实现更复杂的进入/退出行为。
基本上就这些。不复杂但容易忽略的是边界情况处理,比如无效事件或未定义转移。加上断言或日志会更健壮。


