我如何解决此FSM C ++语法错误C3867

时间:2019-11-28 00:49:05

标签: c++ syntax-error state-machine fsm

所以我刚接触C ++,并尝试为此RPG游戏创建FSM,但出现1个语法错误: C3867 non-standard syntax; use '&' to create a pointer to member,但是当我使用'&'时,我会得到另一个error C2276: '&': illegal operation on bound member function expression,这是我的代码:

Class CNPC
{
private : 
    State <CNPC>* CurrentState;
    State<CNPC>* PrevState;
public:
    void ChangeState(State <CNPC> * NewState)
    void revertToPrevState(); 
    void OnUpdate(Uint32 time, Uint32 deltaTime)
}

CNPC.cpp用于更改状态功能

void CNPC::changeState(State<CNPC>* pnewState)
{

    assert(CurrentState && pnewState);

    PrevState = CurrentState;

    CurrentState->Exit(this);

    CurrentState = pnewState;

    CurrentState->Enter(this);

}

状态头文件

class P_Attack : public State<CNPC>
{
public:
    static P_Attack* Instance();
    virtual void Enter(CNPC* npc);
    virtual void Exucute(CNPC* npc);
    virtual void Exit(CNPC* npc);
private:
    P_Attack() {};
};

cpp文件

P_Attack* P_Attack::Instance() // the same layout in all of the states 
{
    static P_Attack* S;
    return S;
}

void P_Attack::Exucute(CNPC*npc)
{ 

    npc->Attacked();


    if(npc->GetHealth() <= 0)
    {
        npc->changeState(Die::Instance()->Enter); // this is where im getting the error
    }

我肯定答案是显而易见的,但它仍在继续困扰着我,很确定我在做一些非常愚蠢的事情

1 个答案:

答案 0 :(得分:0)

您收到的错误是由于您不小心将绑定的成员函数引用作为参数传递给changeState函数。

当您将Die::Instance()->Enter作为参数传递时,不是在传递Enter成员函数的返回值,而是尝试传递Enter函数本身的内存地址。这解释了第一个告诉您追加&的错误,因为编译器认为您实际上是想传递函数引用。

以下问题是,通过引用传递成员函数的语法要求您引用它们的类名,后跟作用域解析::,后跟成员函数名,因此,如果尝试传递,则会出错&Die::Instance()->Enter,因为您没有正确地传递成员函数,因为成员函数属于类而不是实例。因此,当您尝试传递绑定到对象的成员函数时,会收到错误消息,指出该操作是非法的,就好像该对象未绑定一样。本质上,编译器希望看到的是&state<CBNC>::Enter,因为Enter方法绑定到您的状态类,但是它看到您试图获取Enter函数的地址,就像它属于其他的东西。

总而言之,假设Die::Instance()->Enter()不需要参数,如我刚才所示,附加()应该可以解决那些错误,但不能解决根本的问题。 我之所以这样说,是因为看来您的Instance()成员函数可能是一个工厂,该工厂返回了您真正想要传递的状态对象。如果确实如此,那么仅传递Die::Instance()就足够了,因为返回的对象随后将在changeState函数内部调用Enter,并按预期在实例上正确调用Enter。我说这无法解决根本问题,因为您的Enter()函数似乎返回void,因此,简单地将语法更改为上述语法将尝试传递Die::Instance()->Enter()的返回值,因为{最后执行的功能是Enter(),导致出现另一个错误。