0

0

C++如何实现一个状态机_使用C++枚举和类实现有限状态机(FSM)

冰火之心

冰火之心

发布时间:2025-12-01 16:02:46

|

878人浏览过

|

来源于php中文网

原创

首先使用枚举定义状态,如TrafficLightState包含红、黄、绿;再通过类封装状态和行为,构造函数初始化当前状态为红灯;change方法根据当前状态切换至下一状态,displayState输出当前状态名称,实现清晰的状态管理与转换逻辑。

c++如何实现一个状态机_使用c++枚举和类实现有限状态机(fsm)

在C++中实现一个有限状态机(Finite State Machine, FSM)是一种常见且高效的方式,用于管理对象在不同状态之间的转换。通过结合枚举(enum)和类(class),可以清晰地定义状态、事件以及状态转移逻辑,使代码更易读、可维护。

使用枚举定义状态

首先,使用枚举类型来表示状态机中所有可能的状态。这能提高代码的可读性,并避免使用魔法数字或字符串。

enum class TrafficLightState {
    RED,
    YELLOW,
    GREEN
};

这里定义了一个交通灯的状态机,包含红、黄、绿三种状态。使用enum class可以避免命名污染,并提供类型安全。

设计状态机类

接下来,创建一个类来封装状态和行为。该类保存当前状态,并提供处理事件或触发状态转移的方法。

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

class TrafficLight {
private:
    TrafficLightState currentState;

public:
    TrafficLight() : currentState(TrafficLightState::RED) {}

    void change() {
        switch (currentState) {
            case TrafficLightState::RED:
                currentState = TrafficLightState::GREEN;
                break;
            case TrafficLightState::GREEN:
                currentState = TrafficLightState::YELLOW;
                break;
            case TrafficLightState::YELLOW:
                currentState = TrafficLightState::RED;
                break;
        }
    }

    TrafficLightState getState() const {
        return currentState;
    }

    void displayState() const {
        switch (currentState) {
            case TrafficLightState::RED:
                std::cout << "Red\n";
                break;
            case TrafficLightState::GREEN:
                std::cout << "Green\n";
                break;
            case TrafficLightState::YELLOW:
                std::cout << "Yellow\n";
                break;
        }
    }
};

这个类维护当前状态,通过change()方法模拟状态转移。每次调用时,根据当前状态切换到下一个状态。

PaperAiBye
PaperAiBye

支持近30多种语言降ai降重,并且支持多种语言免费测句子的ai率,支持英文aigc报告等

下载

扩展:支持事件驱动的状态转移

更复杂的状态机可以根据输入事件进行转移。可以通过引入事件枚举,并使用二维表或映射结构来定义状态转移规则。

enum class Event {
    TIMER_EXPIRED,
    EMERGENCY_STOP
};

// 简单的状态转移函数示例
void handleEvent(Event event) {
    if (event == Event::TIMER_EXPIRED) {
        change(); // 按照原逻辑切换
    }
}

在实际项目中,也可以使用std::map或查找表来配置“当前状态 + 事件 → 下一状态”的映射关系,提升灵活性。

优点与适用场景

这种基于枚举和类的实现方式简单直观,适合中小型状态机。其优势包括:

  • 状态清晰,类型安全
  • 逻辑集中,易于调试
  • 可扩展性强,便于添加新状态或事件

适用于游戏AI、协议解析、UI流程控制等需要明确状态管理的场景。

基本上就这些。通过枚举定义状态,类封装行为,C++中的状态机实现既简洁又高效。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

619

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

550

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

545

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

161

2025.07.29

c++字符串相关教程
c++字符串相关教程

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

81

2025.08.07

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

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

精品课程

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

共48课时 | 7.3万人学习

好课诞生记
好课诞生记

共20课时 | 6万人学习

swift开发文档
swift开发文档

共33课时 | 19.7万人学习

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

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