C++状态机的概念
本文向我们介绍了 C++ 状态机的概念,说明了如何使用它,并强调了它的优点。
C++ 状态机概述
要理解C++中的状态机,我们首先应该了解有限状态机的概念。
有限状态机是一种计算数学模型,它体现了这样的思想:计算机可以在任何指定时间处于有限数量的状态之一,并且可以随着时间的推移在这些状态之间变化。
状态机由状态、转换和动作组成。 状态是 FSM 可能处于的不同条件。转换是导致从一种状态变为另一种状态的操作。
当 FSM 从一种状态更改为另一种状态时,就会发生这些操作。 C++ 语言有三个定义状态机的关键字:enum、switch 和 goto。
枚举定义了一组表示 FSM 中每个可能状态的常量。 switch 语句检查哪个状态处于活动状态并执行适当的操作。
Goto 用于跳出嵌套循环或 switch 语句,而不中断或返回语句。
状态机的好处
下面列出了一些好处:
- 状态机提供了一种通过简单的转换规则来表达复杂行为的优雅方式。
- 它们非常适合对现实世界系统的特定方面进行建模,例如交通灯、电梯甚至人类语言。
- 状态机将设计解构为状态机术语中的一系列步骤或状态。 每个州负责特定的任务。
- 相反,事件是导致状态机在状态之间移动或转换的刺激。
C++ 中的状态转换
C++状态机代码中的状态转换是程序状态从一种状态变为另一种状态的过程。 事件或条件可以触发称为触发器的状态变化。
当状态发生变化时,可以执行一些操作,例如打印消息或更改屏幕上对象的颜色。
例如,如果长时间没有事件,然后发生事件,则会触发从等待到默认的转换。 C++ 编程语言提供了一种使用 switch 语句实现状态机的简单方法。
C++ 中的状态机类
构建状态机时,您需要两个基类:StateMachine 和 EventData。 从 StateMachine 派生一个类来获取支持状态更改和事件处理所需的组件。
StateMachine 头文件还包含几个预处理器多行宏来帮助实现状态机。 该结构需要是 EventData 基类的继承者,才能为状态函数提供唯一的数据。
我们可以在文件state_machine.cpp和demo.h中找到状态机的源代码。
state_machine.cpp 的示例代码:
#include "demo.h"
#include <iostream>
using namespace std;
void
Execute_State_Machine(void)
{
int 1st_state = 0;
while (1){
char trans_letter;
cout << "1st state: " << 1st_state << "\n";
cout << "Enter trans letter: ";
cin >> trans_letter;
cin.ignore(100, '\n');
demo_Entry const * bn = demo_begin();
demo_Entry const * const p_demo_end = demo_end();
bool demo_um = false;
while ((!demo_um) && (bn != p_demo_end))
{
if (bn->1st_state_id == 1st_state)
{
if (bn->trans_letter == trans_letter)
{
cout << "changing"
<< " from 1st " << 1st_state
<< ", to 2nd " << bn->pro_state_id
<< "\n";
1st_state = bn->pro_state_id;
demo_um = true;
break;
}
}
++bn;
}
if (!demo_um)
{
cerr << "same\n";
}
}
}
demo.h 的示例代码:
struct demo_x
{
int 1st_state_id;
char trans_letter;
int 2nd_state_id;
};
demo_x const * demo_begin(void);
demo_x const * demo_end(void);
demo.cpp 的示例代码:
#include "demo.h"
static const demo_x demo_m[] =
{
{ 0, 'T', 1},
{ 0, 'U', 2},
{ 0, 'V', 3},
};
static const int demo =
sizeof(demo_m) / sizeof(demo_m[0]);
Table_Entry const *
table_begin(void)
{
return &demo_m[0];
}
Table_Entry const *
table_end(void)
{
return &demo_m[demo];
}
相关文章
C++包含路径的概念
发布时间:2023/09/02 浏览次数:97 分类:C++
-
包含路径用于告诉编译器在哪里查找头文件。 编译器将在这些路径指定的目录中搜索,直到找到名称匹配的头文件。Visual Studio IDE 中的 C++ 包含路径目录
在 C++ 中指定 64 位整数
发布时间:2023/09/02 浏览次数:50 分类:C++
-
在本文中,我们将讨论和学习如何在 C++ 中指定 64 位整数。 此外,当使用 64 位整数出现问题时,我们将比较旧方法。
在 C++ 中使用 128 位整数
发布时间:2023/09/02 浏览次数:170 分类:C++
-
在本文中,我们将讨论 C++ 中的 128 位整数。 我们还将了解为什么需要它以及 C++ 中可能的替代方案。
C++ 中的默认构造函数和 default 关键字
发布时间:2023/09/02 浏览次数:127 分类:C++
-
本文讨论 C++ 中的默认构造函数以及新引入的关键字 default。首先,让我们了解一下C++中的默认构造函数。 默认构造函数是一种特殊的构造函数,它没有参数,用于为类的数据成员设置默认值。
C++ 中的空构造函数
发布时间:2023/09/02 浏览次数:165 分类:C++
-
C++ 中的空构造函数是一种不执行任何操作的特殊类型构造函数。 编译器知道没有代码可以执行,因此不会为构造函数生成任何可执行代码。
C++ 中的结构体构造函数
发布时间:2023/09/02 浏览次数:74 分类:C++
-
这篇文章将讨论 struct 的使用以及使用 C++ 添加构造函数。C++结构体简介 struct 代表结构,是组合了一些基本类型变量的用户定义数据类型。 这些变量混合起来形成一个新的单元。
单链表的 C++ 复制构造函数
发布时间:2023/08/31 浏览次数:59 分类:C++
-
本文将首先讨论链表数据结构的概念以及使用它的合适场景。 然后,我们将讨论使用 C++ 的单链表和单链表的复制构造函数的紧凑实现。