0

0

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

穿越時空

穿越時空

发布时间:2025-11-18 12:20:31

|

1023人浏览过

|

来源于php中文网

原创

答案:C++中实现状态机有三种方式:枚举+switch适合简单场景但扩展性差;状态模式通过多态解耦状态行为,易于扩展;函数指针或std::function实现轻量级状态机,灵活适用于小型项目。

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

在C++中实现一个简单的状态机,核心思路是将对象的行为根据当前所处的“状态”进行切换。状态机适用于处理具有明确状态划分和状态转移逻辑的场景,比如游戏角色控制、协议解析、UI流程管理等。

1. 状态机的基本概念

状态机(State Machine)由以下几个要素组成:

  • 状态(State):系统在某一时刻所处的特定情形。
  • 事件(Event)或输入(Input):触发状态转移的外部动作或条件。
  • 转移(Transition):从一个状态到另一个状态的变化过程。
  • 动作(Action):状态转移时执行的操作。

最常见的是有限状态机(FSM, Finite State Machine),它只有有限个状态。

2. 使用枚举+switch实现简单状态机

这是最直观的方式,适合状态和事件不多的场景。

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

// 示例:灯的开关控制状态机 #include iostream>

enum class LightState { OFF, ON };

void LightStateMachine() { LightState currentState = LightState::OFF; std::string input;

while (true) {
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Current state: " 
              zuojiankuohaophpcnzuojiankuohaophpcn (currentState == LightState::ON ? "ON" : "OFF") 
              zuojiankuohaophpcnzuojiankuohaophpcn "\nEnter event (toggle/quit): ";
    std::cin youjiankuohaophpcnyoujiankuohaophpcn input;

    if (input == "quit") break;

    if (input == "toggle") {
        if (currentState == LightState::OFF) {
            std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Turning ON...\n";
            currentState = LightState::ON;
        } else {
            std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Turning OFF...\n";
            currentState = LightState::OFF;
        }
    } else {
        std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Invalid event!\n";
    }
}

}

这个版本结构清晰,但扩展性差,新增状态或事件需要修改多个地方。

3. 面向对象方式:状态模式(State Pattern)

使用多态来解耦状态行为,更易于维护和扩展。

#include stream> #include

// 前向声明 class LightContext;

// 抽象状态类 class LightState { public: virtual ~LightState() = default; virtual void handle(LightContext* context) = 0; };

// 具体状态类 class OnState : public LightState { public: void handle(LightContext* context) override; };

class OffState : public LightState { public: void handle(LightContext* context) override; };

// 上下文类 class LightContext { private: std::unique_ptr currentState; public: void setState(std::unique_ptr state) { currentState = std::move(state); }

void request() {
    if (currentState) {
        currentState-youjiankuohaophpcnhandle(this);
    }
}

};

易想商务网
易想商务网

YxB2B商务网是易想网络旗下的门户型B2B行业网站系统,采用先进的标签技术和静态生成技术,通过网站后台管理轻松实现网站前台多种风格和会员网站多风格,让每一个只要懂得简单网页制作常识的网友,轻松制作出精美专业的的行业商务网站系统。系统高速、稳定、安全,完全仿阿里巴巴功能设计,有供应信息、求购信息、产品库、公司库、专项商机、行业信息、展会服务、人才市场、会员助手、网商博客、商友论坛、全方位搜索等栏目

下载

// 实现具体状态的行为 void OnState::handle(LightContext* context) { std::cout setState(std::make_unique()); }

void OffState::handle(LightContext* context) { std::cout setState(std::make_unique()); }

// 使用示例 int main() { LightContext light; light.setState(std::make_unique());

for (int i = 0; i zuojiankuohaophpcn 5; ++i) {
    light.request();
}

return 0;

}

这种方式的优点是新增状态只需添加新类,符合开闭原则。每个状态的行为独立封装,逻辑清晰。

4. 使用函数指针或std::function实现轻量级状态机

如果不想引入复杂的类体系,可以用函数对象简化实现。

#include #include #include #include

using StateFunc = std::function;

void stateA(); void stateB();

std::map<:string statefunc> states = { {"A", stateA}, {"B", stateB} };

std::string currentState = "A";

void stateA() { std::cout

void stateB() { std::cout

int main() { for (int i = 0; i

这种方法轻便灵活,适合小型项目或嵌入式环境。

基本上就这些。选择哪种方式取决于你的需求:简单逻辑用枚举+switch;需要扩展性用状态模式;追求简洁可用函数映射。关键是把状态转移逻辑理清楚,避免混乱的if-else嵌套。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

731

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

529

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

410

2024.03.13

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.9万人学习

好课诞生记
好课诞生记

共20课时 | 6万人学习

swift开发文档
swift开发文档

共33课时 | 19万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号