无法编译FSM示例代码

1 c++ state-machine

Robert C. Martin提供了一个很好的状态机教程,名为UML Tutorial:Finite State Machines.但我无法编译它提供的示例代码.我得到*FsmTest.cpp(46):错误C2664:'SetState':无法将参数1从'class UnlockedState*'转换为'class TurnstileState '

请帮忙.谢谢.

class Turnstile
{
public:
    virtual void Lock();
    virtual void Unlock();
    virtual void Thankyou();
    virtual void Alarm();
};

class TurnstileFSM;
class LockedState;
class UnlockedState;

class TurnstileState
{
public:
    virtual void Coin(TurnstileFSM*) = 0;
    virtual void Pass(TurnstileFSM*) = 0;
protected:
    static LockedState lockedState;
    static UnlockedState unlockedState;
};

class TurnstileFSM : public Turnstile
{
public:
    void SetState(TurnstileState* s) {itsState = s;}
    void Coin() {itsState->Coin(this);}
    void Pass() {itsState->Pass(this);}


private:
    TurnstileState *itsState;
};

class LockedState : public TurnstileState
{
public:
    virtual void Coin(TurnstileFSM* t)
    {
        t->SetState(&unlockedState);
        t->Unlock();
    }
    virtual void Pass(TurnstileFSM* t)
    {
        t->Alarm();
    }
};

class UnlockedState : public TurnstileState
{
public:
    virtual void Coin(TurnstileFSM* t)
    {
        t->Thankyou();
    }
    virtual void Pass(TurnstileFSM* t)
    {
        t->SetState(&lockedState);
        t->Lock();
    }
};

LockedState TurnstileState::lockedState;
UnlockedState TurnstileState::unlockedState;
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 5

问题是,当你尝试调用SetState()内部时LockedState::Coin(),类UnlockedState是一个不完整的类型:它已被声明未定义.为了解决这个问题,你需要将of的定义移到以下Coin()之后UnlockedState:

class LockedState : public TurnstileState
{
public:
    virtual void Coin(TurnstileFSM* t);
    ...
};

class UnlockedState : public TurnstileState
{
    ...
};

void LockedState::Coin(TurnstileFSM* t)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)