c++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现

答案:通过枚举定义状态与事件,使用映射表实现状态转移,结合进入/退出动作处理,构建可扩展的c++有限状态机。

c++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现

实现一个简单的有限状态机(Finite State machine, FSM)在C++中可以通过类和状态转移表的方式完成。核心思路是将状态和事件抽象出来,通过映射关系决定状态如何迁移,并在进入或退出状态时执行相应动作。

定义状态与事件

首先明确系统有哪些状态和事件。比如设计一个简单的灯控系统:

  • 状态:关(OFF)、开(ON)
  • 事件:按下开关(TOGGLE)

可以用枚举来表示:

 enum class State {     OFF,     ON };  enum class Event {     TOGGLE }; 

设计状态机类

创建一个FSM类,维护当前状态,并提供处理事件的接口。状态转移逻辑可以放在一个查找表中。

立即学习C++免费学习笔记(深入)”;

c++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现

Giiso写作机器人

Giiso写作机器人,让写作更简单

c++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现56

查看详情 c++怎么实现一个简单的有限状态机_c++有限状态机FSM的设计与实现

 #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,实现更复杂的进入/退出行为。

基本上就这些。不复杂但容易忽略的是边界情况处理,比如无效事件或未定义转移。加上断言或日志会更健壮。

上一篇
下一篇
text=ZqhQzanResources