Ошибка: нестатический элемент данных объявлен ‘автоматически’

#c #function #lambda #non-static

#c #функция #лямбда #нестатический

Вопрос:

Я создаю класс с именем «StateMachine» для создания других классов, которые наследуют эту логику.

Пытаясь заставить структуру «Состояния» хранить указатель на функцию для выполнения в этом состоянии, я обнаружил, что мне нужно использовать лямбда-функции. Однако, похоже, я не могу объявить автоматический элемент внутри структуры, если он не является «scatic const».

statemachine.h

 #include <vector>
#include <string>
#include <map>
using namespace std;

struct State
{
    string id;
    auto action;
    string next;

    State():id(""){}
    State(string _id, auto func, string n = ""):id(_id), action(func), next(n){}
};

class StateMachine
{
  protected:
    void addState(string id, auto func)
    {
      if(activeState == ""){activeState = id;}
      stateList.insert(pair<string, State>(id, State(id, func)));
    }

    void doAction()
    {
      if(stateList[activeState].action != nullptr)
      {
        (*stateList[activeState].action)();

        if(stateList[activeState].next != "")
        {
          activeState = stateList[activeState].next;
        }
      }
    }

    void setState(string state)
    {
      if(stateList.count(state) != 0)
      {
        activeState = state;
      }
    }

    string getState()
    {
      return activeState;
    }

  private:
    map<string, State> stateList;
    string activeState = "";
};
  

Пример использования

 class Player : public StateMachine
{
  public:
    Player()
    {
      addState("ST_SPAWN", [this]{this->OnSpawn();});
    }
    virtual ~Player(){}

    void OnSpawn()
    {
        //...
    }
};
  

Ошибка

 /home/yawin/Dokumentuak/Proyectos/C  /Dough/src/./include/interfaces/statemachine.h:34:10: error: non-static data member declared ‘autoauto action;
  

Что я могу сделать?

Комментарии:

1. Почему auto ? В вашем коде предполагается, что func это указатель на функцию без параметров.

Ответ №1:

Вы могли бы использовать std::function для упрощения этого.

 #include <functional>

struct State {
    string id;
    std::function<void()> action;
    string next;

    State(){id = "";}
    State(string _id, std::function<void()> func, string n = "") :
        id(_id), action(func), next(n) {}
};
  
 class StateMachine {
    //...
    void addState(string id, std::function<void()> func) {
        if(activeState == "") activeState = id;
        stateList.emplace(id, State{id, func});
    }
    //...
  

Комментарии:

1. О! Это работает! Большое вам спасибо. Я не знал об этой библиотеке.