【问题标题】:how do i fix this FSM C++ syntax error C3867我如何修复这个 FSM C++ 语法错误 C3867
【发布时间】:2020-03-23 14:35:16
【问题描述】:

所以我是 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
    }

我确定答案是显而易见的,但它仍然让我难以理解,我很确定我在做一些非常愚蠢的事情

【问题讨论】:

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


    【解决方案1】:

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

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

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

    话虽如此,假设Die::Instance()-&gt;Enter() 不需要参数,我刚才展示的附加() 应该可以解决那些 错误,但不能解决根本问题。 我这样说是因为您的 Instance() 成员函数很可能是一个工厂,它返回您真正想要传递的状态对象。如果实际上是这种情况,只需传递Die::Instance() 就足够了,因为返回的对象将在您的changeState 函数内部调用Enter,并按预期在您的实例上正确调用Enter。我说它不会解决根本问题,因为您的 Enter() 函数似乎返回 void,因此只需将语法更改为上述将尝试传递 Die::Instance()-&gt;Enter() 的返回值,这将作为最后一个执行的函数无效是Enter() 导致出现另一个错误。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2011-04-28
      相关资源
      最近更新 更多