Я создаю класс StateMachine, чтобы другие классы наследовали эту логику.
Пытаясь сохранить в структуре State указатель на функцию для выполнения в этом состоянии, я обнаружил, что мне нужно использовать лямбда-функции. Тем не менее, я не могу объявить автоматический член внутри структуры, если он не является константным.
машина состояний.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 ‘auto’
auto action;
Что я могу сделать?
auto
? В вашем коде предполагается, чтоfunc
является указателем на функцию без параметров. - person molbdnilo   schedule 28.09.2020