C++ 상태 머신의 개념
이 자습서에서는 C++ 상태 머신의 개념에 대해 교육하고 이를 사용하는 방법을 설명하며 그 이점을 강조합니다.
C++의 상태 머신 개요
C++의 상태 기계를 이해하려면 먼저 유한 상태 기계의 개념에 대해 알아야 합니다.
유한 상태 기계는 컴퓨터가 지정된 시간에 상태의 유한 숫자 중 하나에 있을 수 있고 시간이 진행됨에 따라 이러한 상태 간에 변경될 수 있다는 아이디어를 캡처하는 계산의 수학적 모델입니다.
상태 머신은 상태, 전환 및 작업으로 구성됩니다. 상태는 FSM이 있을 수 있는 다양한 조건입니다. 전환은 한 상태에서 다른 상태로 변경을 유발하는 작업입니다.
작업은 FSM이 한 상태에서 다른 상태로 변경될 때 발생합니다. C++ 언어에는 상태 머신을 정의하는 세 가지 키워드인 enum
, switch
및 goto
가 있습니다.
An 열거형
은 FSM에서 가능한 각 상태를 나타내는 일련의 상수를 정의합니다. switch 문은 활성 상태를 확인하고 적절한 작업을 실행합니다.
Goto
는 명령문을 중단하거나 반환하지 않고 중첩된 루프 또는 스위치 명령문에서 점프하는 데 사용됩니다.
상태 머신의 이점
일부 혜택은 다음과 같습니다.
- 상태 기계는 간단한 전환 규칙을 통해 복잡한 동작을 표현하는 우아한 방법을 제공합니다.
- 신호등, 엘리베이터 또는 인간 언어와 같은 실제 시스템의 특정 측면을 모델링하는 데 매우 적합합니다.
- 상태 기계는 설계를 일련의 단계 또는 상태 기계 전문 용어로 된 상태로 분해합니다. 각 상태는 특정 작업을 담당합니다.
- 대조적으로, 이벤트는 상태 기계가 상태 사이를 이동하거나 전이하도록 하는 자극입니다.
C++의 상태 전환
C++ 상태 머신 코드의 상태 전환은 프로그램의 상태가 한 상태에서 다른 상태로 변경되는 프로세스입니다. 이벤트 또는 조건은 트리거라고 하는 상태 변경을 트리거할 수 있습니다.
상태가 변경되면 메시지 인쇄 또는 화면의 개체 색상 변경과 같은 일부 작업을 실행할 수 있습니다.
예를 들어 오랫동안 이벤트가 없었다가 이벤트가 발생하면 waiting
에서 default
로 전환됩니다. C++ 프로그래밍 언어는 switch 문을 사용하여 상태 머신을 구현하는 쉬운 방법을 제공합니다.
C++의 상태 머신 클래스
상태 시스템을 구축할 때 StateMachine
및 EventData
라는 두 가지 기본 클래스가 필요합니다. 클래스는 상태 변경 및 이벤트 처리를 지원하는 데 필요한 구성 요소를 가져오기 위해 StateMachine
에서 파생됩니다.
StateMachine
헤더에는 상태 시스템을 구현하는 데 도움이 되는 여러 전처리기 다중 행 매크로도 포함되어 있습니다. 상태 함수에 고유한 데이터를 제공하려면 구조가 EventData
기본 클래스의 상속자여야 합니다.
state_machine.cpp
및 demo.h
파일에서 상태 시스템의 소스 코드를 찾을 수 있습니다.
state_machine.cpp
에 대한 예제 코드:
#include <iostream>
#include "demo.h"
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]; }
위에서 언급한 코드의 작동을 확인하려면 여기를 클릭하십시오.
Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.
Facebook