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

在C++中实现状态机,核心是把“对象的行为随状态变化而变化”这一逻辑显式建模。常用两种思路:一种是用状态模式(State Pattern)——面向对象、可扩展、适合复杂状态逻辑;另一种是有限状态机(FSM)——更轻量、常基于枚举+switch或状态表驱动,适合嵌入式或性能敏感场景。两者不是互斥,而是适用场景不同。
状态模式把每个状态封装成独立类,让状态切换和行为委托给具体状态对象,避免大段if-else或switch,也便于新增状态。
关键点:
handleEvent())IdleState、RunningState)实现子类,各自封装行为逻辑Context)持有一个State*指针,负责委托调用,并在需要时切换状态示例片段:
立即学习“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); }
};适合状态少、事件简单、追求零开销抽象的场景(如协议解析、设备驱动)。用enum class定义状态,用成员变量保存当前状态,用switch分发事件处理。
优点:无虚函数开销、内存紧凑、调试直观;缺点:状态增多后易臃肿,行为复用性差。
建议写法:
transition()函数中,返回新状态,避免在各case里分散写state_ = ...
[[fallthrough]]明确表达意图,避免误触发示例:
enum class FSMState { Idle, Processing, Done };
struct SimpleFSM {
FSMState state_ = FSMState::Idle;
void handleInput(char c) {
auto next = transition(state_, c);
if (next != state_) {
onExit(state_);
state_ = next;
onEnter(state_);
}
}
private:
FSMState transition(FSMState s, char c) {
switch (s) {
case FSMState::Idle: return (c == 'S') ? FSMState::Processing : s;
case FSMState::Processing: return (c == 'E') ? FSMState::Done : s;
case FSMState::Done: return s;
}
return s;
}
};把状态转移规则外化为二维表(状态 × 事件 → 新状态 + 动作),适合规则稳定、状态/事件较多的系统(如通信协议栈)。
典型结构:
EvStart, EvStop)std::array<:array n_events>, N_STATES> table;</:array>
next_state和action(可为函数指针或std::function)好处是业务规则与代码分离,易于配置、测试和生成;缺点是引入间接层,小项目略重。
不复杂但容易忽略:
onExit)和进入新状态(onEnter)的顺序正确,尤其涉及资源释放/初始化state_,统一走transition路径,保证可控性和可测性std::cout ),比断点更高效
基本上就这些。状态机不是炫技,关键是让状态流转可读、可测、可演进。从枚举switch起步,状态变复杂了再升级到状态模式或状态表,更务实。
以上就是c++++如何实现一个状态机_c++状态模式与有限状态机(FSM)【设计模式】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号