# CppState **Repository Path**: andwp/cpp-state ## Basic Information - **Project Name**: CppState - **Description**: C++的状态机框架 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 4 - **Created**: 2021-07-04 - **Last Updated**: 2024-07-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CppState #### 介绍 C++的状态机框架,使用C++11标准库,不依赖第三方库。 #### 软件架构 TODO UML类图、时序图。 目录文件包括 - Action.h 动作类,表示一个操作或事件。 - State.h 状态类,根据业务定义的状态。 - StateMachine.h 状态机,状态机的上下文入库。 - Transition.h 转换类,封装转换业务。 #### 使用说明 使用参见[Demo代码](https://gitee.com/andwp/cpp-state/blob/master/ConsoleApplication1/ConsoleApplication1.cpp),初始说明如下: 1. 初始化状态类State ``` State* yellowToRedState = new State; // (转红灯的)黄灯状态。 State* greenState = new State; // 绿灯状态。 State* yellowToGreenState = new State; // (转绿灯的)黄灯状态。 State* redState = new State; // 红灯状态。 State* initState = new State; // 初始状态。 State* finalState = new State; // 关闭状态。 ``` 2. 为状态类初始回调、转换方式等 State的setExec、setEnter、setExit方法分别设置状态的执行、进入、退出回调。 addTransition方法用于转换的设置。 ``` // 黄灯(转为红灯过渡) auto yellowToRedStateExec = []() { cout << "Yellow (To Red ) Light Exec" << endl; }; yellowToRedState->setExec(yellowToRedStateExec); yellowToRedState->addTransition(Continue, redState); //黄灯关闭,转为红灯。 yellowToRedState->addTransition(Exit, finalState); // 直接关闭,转为终止。 .... ``` 3. 初始化状态机 (StateMachine) > StateMachine sm; > // 状态机类为模板类,模板的类型表示动作类型(可以为数字、枚举等)。 4.状态机赋值 addState为状态机加入状态(状态管理主要用于之后的释放) 。 initState 设置初始状态。 ``` sm.addState(yellowToRedState); sm.addState(greenState); sm.addState(yellowToGreenState); sm.addState(redState); sm.addState(finalState); sm.addState(initState); sm.initState(initState); ``` 5.启动状态机 启动成功返回true。 > sm.start() 6. 执行动作 doAction 执行状态机的内部动作。Action的值与动作类型相关。 ``` sm.doAction(Action(Continue)); sm.doAction(Action(Continue)); sm.doAction(Action(Continue)); sm.doAction(Action(Continue)); sm.doAction(Action(Continue)); ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request