错误:非静态数据成员声明为“自动”

问题描述

我正在制作一个名为“ StateMachine”的类,以制作其他继承该逻辑的类。

试图使“状态”结构存储指向要在该状态下执行的函数的指针,我发现自己需要使用lambda函数。但是,如果没有“ 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 ‘auto’
     auto action;

我该怎么办?

解决方法

您可以使用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});
    }
    //...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...