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

在C++中实现状态机,核心是把“对象的行为随状态变化而变化”这一逻辑显式建模。常用两种思路:一种是用状态模式(State Pattern)——面向对象、可扩展、适合复杂状态逻辑;另一种是有限状态机(FSM)——更轻量、常基于枚举+switch或状态表驱动,适合嵌入式或性能敏感场景。两者不是互斥,而是适用场景不同。
用状态模式实现可维护的状态机
状态模式把每个状态封装成独立类,让状态切换和行为委托给具体状态对象,避免大段if-else或switch,也便于新增状态。
关键点:
- 定义统一的State抽象基类,声明所有状态共有的接口(如
handleEvent()) - 为每个具体状态(如
IdleState、RunningState)实现子类,各自封装行为逻辑 - 上下文类(如
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分发事件处理。
优点:无虚函数开销、内存紧凑、调试直观;缺点:状态增多后易臃肿,行为复用性差。
建议写法:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~