0

0

c++如何实现一个简单的状态机_c++状态设计模式应用

穿越時空

穿越時空

发布时间:2025-12-12 18:47:34

|

294人浏览过

|

来源于php中文网

原创

答案:C++中可通过状态模式实现状态机,定义抽象状态类和具体状态类处理行为,上下文类持有当前状态并委托调用,示例交通灯在红、绿、黄间切换,每调用change则按逻辑转换状态,输出对应信息。该方式避免大量条件判断,提升可维护性与扩展性,新增状态无需修改原有代码,符合开闭原则,适用于状态多且转换复杂的系统如游戏控制或UI流程。

c++如何实现一个简单的状态机_c++状态设计模式应用

在C++中实现一个简单的状态机,可以采用状态模式(State Pattern),这是一种行为设计模式,它允许对象在内部状态改变时修改其行为。通过将每个状态封装成独立的类,可以让状态转换更清晰、可维护性更强。

1. 状态模式的基本结构

状态模式的核心是定义一个状态接口,各个具体状态实现该接口,同时上下文(Context)持有当前状态的指针,并将状态相关的行为委托给当前状态对象。

示例:交通灯状态机(红、绿、黄)

#include 
#include 

// 前向声明
class TrafficLight;

// 抽象状态类
class LightState {
public:
    virtual ~LightState() = default;
    virtual void change(TrafficLight& light) = 0;
    virtual std::string getStateName() const = 0;
};

// 具体状态类 - 红灯
class RedState : public LightState {
public:
    void change(TrafficLight& light) override;
    std::string getStateName() const override { return "Red"; }
};

// 具体状态类 - 绿灯
class GreenState : public LightState {
public:
    void change(TrafficLight& light) override;
    std::string getStateName() const override { return "Green"; }
};

// 具体状态类 - 黄灯
class YellowState : public LightState {
public:
    void change(TrafficLight& light) override;
    std::string getStateName() const override { return "Yellow"; }
};

2. 上下文类管理状态

TrafficLight 类作为上下文,持有一个当前状态的智能指针,并提供接口触发状态切换。

class TrafficLight {
private:
    std::unique_ptr currentState;

public:
    TrafficLight(std::unique_ptr state) : currentState(std::move(state)) {}

    void setState(std::unique_ptr state) {
        currentState = std::move(state);
    }

    void requestChange() {
        currentState->change(*this);
    }

    std::string getCurrentState() const {
        return currentState->getStateName();
    }
};

3. 实现状态切换逻辑

每个状态的 change 方法决定下一个状态是什么,并通过上下文更新状态。

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

SUN2008 企业网站管理系统2.0 beta
SUN2008 企业网站管理系统2.0 beta

1、数据调用该功能使界面与程序分离实施变得更加容易,美工无需任何编程基础即可完成数据调用操作。2、交互设计该功能可以方便的为栏目提供个性化性息功能及交互功能,为产品栏目添加产品颜色尺寸等属性或简单的留言和订单功能无需另外开发模块。3、静态生成触发式静态生成。4、友好URL设置网页路径变得更加友好5、多语言设计1)UTF8国际编码; 2)理论上可以承担一个任意多语言的网站版本。6、缓存机制减轻服务器

下载
void RedState::change(TrafficLight& light) {
    std::cout << "Red -> Green\n";
    light.setState(std::make_unique());
}

void GreenState::change(TrafficLight& light) {
    std::cout << "Green -> Yellow\n";
    light.setState(std::make_unique());
}

void YellowState::change(TrafficLight& light) {
    std::cout << "Yellow -> Red\n";
    light.setState(std::make_unique());
}

使用示例:

int main() {
    TrafficLight light(std::make_unique());

    for (int i = 0; i < 6; ++i) {
        std::cout << "Current: " << light.getCurrentState() << " | ";
        light.requestChange();
    }

    return 0;
}

输出:

Current: Red | Red -> Green
Current: Green | Green -> Yellow
Current: Yellow | Yellow -> Red
Current: Red | Red -> Green
Current: Green | Green -> Yellow
Current: Yellow | Yellow -> Red

4. 优势与适用场景

这种实现方式避免了大量 if/else 或 switch/case 判断状态,提升了扩展性和可读性。

  • 新增状态只需添加新类,符合开闭原则
  • 状态转换逻辑分散在各自类中,职责清晰
  • 适合状态较多、转换复杂的系统,如游戏角色控制、UI流程管理等

基本上就这些。状态模式让状态流转变得直观且易于维护,是C++中实现状态机的一种优雅方式。

相关专题

更多
if什么意思
if什么意思

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

764

2023.08.22

switch语句用法
switch语句用法

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

535

2023.09.21

Java switch的用法
Java switch的用法

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

418

2024.03.13

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1051

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

107

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

563

2025.12.29

java接口相关教程
java接口相关教程

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

11

2026.01.19

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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