Concepto de máquina de estado de C++

Muhammad Adil 12 octubre 2023
  1. Descripción general de la máquina de estado en C++
  2. Beneficios de la máquina de estado
  3. Transición de estado en C++
  4. Clase de máquina de estado en C++
Concepto de máquina de estado de C++

Este tutorial nos educa sobre el concepto de una máquina de estado de C++, ilustra cómo podemos usarla y destaca sus beneficios.

Descripción general de la máquina de estado en C++

Para comprender la máquina de estados en C++, primero debemos conocer el concepto de una máquina de estados finitos.

Una máquina de estados finitos es un modelo matemático de computación que captura la idea de que una computadora puede estar en uno de los números finitos de los estados en cualquier momento específico y puede cambiar entre estos estados a medida que pasa el tiempo.

Una máquina de estado se compone de estados, transiciones y acciones. Los estados son las diferentes condiciones en las que puede estar el FSM. Las transiciones son las acciones que provocan un cambio de un estado a otro.

Las acciones suceden cuando el FSM cambia de un estado a otro. El lenguaje C++ tiene tres palabras clave que definen una máquina de estado: enum, switch y goto.

Una enumeración define un conjunto de constantes que representan cada estado posible en el FSM. Una declaración de cambio verifica qué estado está activo y ejecuta una acción apropiada.

El Ir a se usa para saltar fuera de bucles anidados o cambiar declaraciones sin romper o devolver declaraciones.

Beneficios de la máquina de estado

Algunos de los beneficios se enumeran a continuación:

  • Las máquinas de estado proporcionan una forma elegante de expresar un comportamiento complejo a través de reglas de transición simples.
  • Son adecuados para modelar aspectos específicos de sistemas del mundo real, como semáforos, ascensores o incluso lenguajes humanos.
  • Las máquinas de estado deconstruyen el diseño en una serie de pasos o estados en la jerga de las máquinas de estado. Cada estado es responsable de una tarea específica.
  • Por el contrario, los eventos son los estímulos que hacen que la máquina de estado se mueva o haga una transición entre estados.

Transición de estado en C++

La transición de estado en el código de máquina de estado de C++ es un proceso en el que el estado del programa cambia de un estado a otro. Un evento o condición puede desencadenar el cambio de estados denominado desencadenante.

Cuando cambia un estado, se pueden ejecutar algunas acciones, como imprimir mensajes o cambiar el color de los objetos en la pantalla.

Por ejemplo, si no hay un evento durante mucho tiempo y luego ocurre un evento, la transición se activará de esperando a predeterminado. El lenguaje de programación C++ proporciona una manera fácil de implementar una máquina de estado utilizando su declaración de cambio.

Clase de máquina de estado en C++

Al construir su máquina de estado, necesitará dos clases base: StateMachine y EventData. Una clase se deriva de StateMachine para obtener los componentes necesarios para admitir cambios de estado y manejo de eventos.

El encabezado StateMachine también incluye varias macros multilínea de preprocesador para ayudar a implementar la máquina de estado. La estructura debe ser heredera de la clase base EventData para proporcionar datos únicos a las funciones de estado.

Podemos encontrar el código fuente de la máquina de estado en los archivos state_machine.cpp y demo.h.

Código de ejemplo para 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";
    }
  }
}

Código de ejemplo para 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);

Código de ejemplo para 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]; }

Haga clic aquí para comprobar el funcionamiento del código mencionado anteriormente.

Muhammad Adil avatar Muhammad Adil avatar

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