c++如何实现一个状态机_c++状态模式与有限状态机(FSM)【设计模式】

admin 百科 19
C++中实现状态机主要有三种方式:状态模式(面向对象、可扩展)、枚举+switch FSM(轻量、零开销)、状态表驱动FSM(规则外化、易维护);应据场景复杂度与性能需求选型,强调状态切换顺序、解耦与可测性。

c++如何实现一个状态机_c++状态模式与有限状态机(FSM)【设计模式】-第1张图片-佛山资讯网

在C++中实现状态机,核心是把“对象的行为随状态变化而变化”这一逻辑显式建模。常用两种思路:一种是用状态模式(State Pattern)——面向对象、可扩展、适合复杂状态逻辑;另一种是有限状态机(FSM)——更轻量、常基于枚举+switch或状态表驱动,适合嵌入式或性能敏感场景。两者不是互斥,而是适用场景不同。

用状态模式实现可维护的状态机

状态模式把每个状态封装成独立类,让状态切换和行为委托给具体状态对象,避免大段if-else或switch,也便于新增状态。

关键点:

  • 定义统一的State抽象基类,声明所有状态共有的接口(如handleEvent()
  • 为每个具体状态(如IdleStateRunningState)实现子类,各自封装行为逻辑
  • 上下文类(如Context)持有一个State*指针,负责委托调用,并在需要时切换状态
  • 状态切换由当前状态决定(推荐),或由Context协调(需谨慎避免循环依赖)

示例片段:

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

struct State {
    virtual ~State() = default;
    virtual void onEventA(Context&) = 0;
    virtual void onEventB(Context&) = 0;
};
<p>struct IdleState : State {
void onEventA(Context& ctx) override { ctx.setState(std::make_unique<RunningState>()); }
void onEventB(Context&) override { /<em> 忽略 </em>/ }
};</p><p>struct Context {
std::unique<em>ptr<State> state</em>;
Context() : state_(std::make_unique<IdleState>()) {}
void setState(std::unique<em>ptr<State>&& s) { state</em> = std::move(s); }
void handleA() { state_->onEventA(*this); }
};

登录后复制

用枚举+switch实现轻量FSM

适合状态少、事件简单、追求零开销抽象的场景(如协议解析、设备驱动)。用enum class定义状态,用成员变量保存当前状态,用switch分发事件处理。

优点:无虚函数开销、内存紧凑、调试直观;缺点:状态增多后易臃肿,行为复用性差。

建议写法:

标签: 回调函数 c++ switch

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~