C++ 无法编译FSM示例代码

C++ 无法编译FSM示例代码,c++,state-machine,C++,State Machine,有一个很好的状态机教程叫罗伯特C马丁。但我无法编译它提供的示例代码。我得到*FsmTest.cpp(46):错误C2664:'SetState':无法将参数1从'class unlockdstate*'转换为'class turnstigestate' 请帮忙。谢谢 class Turnstile { public: virtual void Lock(); virtual void Unlock(); virtual void Thankyou(); virtu

有一个很好的状态机教程叫罗伯特C马丁。但我无法编译它提供的示例代码。我得到*FsmTest.cpp(46):错误C2664:'SetState':无法将参数1从'class unlockdstate*'转换为'class turnstigestate'

请帮忙。谢谢

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;

这很可能是因为它还不知道UnlockedState是旋转栅门的一个子类。将函数从类内部删除到文件末尾:

class TurnstileFSM {
    void SetState(TurnstileState* s);
};

void TurnstileFSM::SetState(TurnstileState* s) {itsState = s;}

这很可能是因为它还不知道UnlockedState是旋转栅门的一个子类。将函数从类内部删除到文件末尾:

class TurnstileFSM {
    void SetState(TurnstileState* s);
};

void TurnstileFSM::SetState(TurnstileState* s) {itsState = s;}

问题是,当您尝试在
LockedState::Coin()
内部调用
SetState()
时,类
UnlockedState
是一个不完整类型:它已声明但未定义。为了修复它,您需要将
Coin()
的定义移到
解锁状态的定义之后:

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

class UnlockedState : public TurnstileState
{
    ...
};

void LockedState::Coin(TurnstileFSM* t)
{
    ...
}

问题是,当您尝试在
LockedState::Coin()
内部调用
SetState()
时,类
UnlockedState
是一个不完整类型:它已声明但未定义。为了修复它,您需要将
Coin()
的定义移到
解锁状态的定义之后:

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

class UnlockedState : public TurnstileState
{
    ...
};

void LockedState::Coin(TurnstileFSM* t)
{
    ...
}

在本例中,生成的代码应该包括tscontext.h,TurnStyle类是从上下文派生的,它应该在*tscontext.h“中声明为类TurnStyleContext

在我的例子中,生成的代码如下所示:

通过以下方式定义状态机:

Context TurnStyleContext     // the name of the context class
FSMName TurnStyle            // the name of the FSM to create
Initial Locked               // the name of the initial state
                             // for C++ output
pragma Header  tscontext.h"   // the header file name for the context class, note the necessary "
{
    Locked
    {
        Coin     Unlocked    Unlock
        Pass     Locked      Alarm
    }
    Unlocked <BeforeUnlocked >AfterUnlocked
    {
        Coin    Unlocked    Thankyou
        Pass    Locked      Lock
    }
}
Context TurnStyleContext//上下文类的名称
FSMName TurnStyle//要创建的FSM的名称
Initial Locked//初始状态的名称
//用于C++输出
pragma Header tscontext.h//上下文类的头文件名,请注意必要的“
{
锁定
{
硬币解锁
超车锁定报警器
}
解锁后解锁
{
谢谢
过关锁
}
}

上下文实现了FSMError、Thankyou、Lock、Alarm、Unlock、BeforeUnlocked、AfterUnlocked

在示例中,生成的代码应该包括tscontext.h,TurnStyle类是从上下文派生的,应该在*tscontext.h“中声明为类TurnStyleContext

在我的例子中,生成的代码如下所示:

通过以下方式定义状态机:

Context TurnStyleContext     // the name of the context class
FSMName TurnStyle            // the name of the FSM to create
Initial Locked               // the name of the initial state
                             // for C++ output
pragma Header  tscontext.h"   // the header file name for the context class, note the necessary "
{
    Locked
    {
        Coin     Unlocked    Unlock
        Pass     Locked      Alarm
    }
    Unlocked <BeforeUnlocked >AfterUnlocked
    {
        Coin    Unlocked    Thankyou
        Pass    Locked      Lock
    }
}
Context TurnStyleContext//上下文类的名称
FSMName TurnStyle//要创建的FSM的名称
Initial Locked//初始状态的名称
//用于C++输出
pragma Header tscontext.h//上下文类的头文件名,请注意必要的“
{
锁定
{
硬币解锁
超车锁定报警器
}
解锁后解锁
{
谢谢
过关锁
}
}
上下文实现了FSMError、Thankyou、Lock、Alarm、Unlock、beforeiunlocked、AfterUnlocked

Oh,“有限状态机”。我以为你的意思是“飞行的意大利面怪物”。-)哦,“有限状态机”。我以为你的意思是“飞行的意大利面怪物”。-)