PDA

View Full Version : State machine implementation



yyiu002
28th June 2010, 02:07
Hi everyone,
I have read the article at: http://www.objectmentor.com/resources/articles/umlfsm.pdf
I have managed to compile following code:


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;


My question is:
1. How do I use this code? Give me an example.
2. Why would I need to 2 global state variables:
LockedState TurnstileState::lockedState;
UnlockedState TurnstileState::unlockedState;

Thanks.

yyiu002
28th June 2010, 04:57
I guess I know how it works now.

Those 2 global variable was used to create 2 pointers for FSM to store its state.