ステートパターンについて
Posted: 2009年11月17日(火) 22:43
今現在、「独習 デザインパターン C++」という本の「ステートパターン」
というものをやっているのですが、本の内容通りに書いてコンパイルしても
エラーが出てしまいます。
恐らくクラスの順番に問題があるんだと思うのですが、理解出来ずにいます。
ご指摘 頂けないでしょうか。よろしくお願いします。
というものをやっているのですが、本の内容通りに書いてコンパイルしても
エラーが出てしまいます。
恐らくクラスの順番に問題があるんだと思うのですが、理解出来ずにいます。
ご指摘 頂けないでしょうか。よろしくお願いします。
/*
**State.h
*/
// EngineBox ////////////////////////////////////////////////////////
class EngineBox
{
public:
EngineBox();
~EngineBox();
void up();
void down();
void changeState( EngineState* newState );
void nowState();
private:
EngineState* state;
};
// EngineState //////////////////////////////////////////////////////
class EngineState
{
public:
virtual void up( EngineBox* pEBox ) = 0;
virtual void down( EngineBox* pEBox ) = 0;
virtual void showCurrentState() = 0;
};
// EngineIdle ///////////////////////////////////////////////////////
class EngineIdle : public EngineState
{
public:
void up( EngineBox* pEBox );
void down( EngineBox* pEBox );
void showCurrentState();
};
// EngineRunningLow /////////////////////////////////////////////////
class EngineRunningLow : public EngineState
{
public:
void up( EngineBox* pEBox );
void down( EngineBox* pEBox );
void showCurrentState();
};
// EngineRunningHigh ////////////////////////////////////////////////
class EngineRunningHigh : public EngineState
{
public:
void up( EngineBox* pEBox );
void down( EngineBox* pEBox );
void showCurrentState();
};
/*
**State.cpp
*/
#include "State.h"
#include <iostream>
using namespace std;
/////////////////////////////////////////////////////////////////////
// EngineBox ////////////////////////////////////////////////////////
EngineBox::EngineBox()
{
state = new EngineIdle();
}
EngineBox::~EngineBox()
{
delete state;
}
void EngineBox::up()
{
state->up( this );
}
void EngineBox::down()
{
state->down( this );
}
void EngineBox::changeState( EngineState* newState )
{
delete state;
state = newState;
}
void EngineBox::nowState()
{
state->showCurrentState();
}
/////////////////////////////////////////////////////////////////////
// EngineIdle ///////////////////////////////////////////////////////
void EngineIdle::up( EngineBox *pEBox )
{
cout << "Idle -> Low" << endl;
pEBox->changeState( new EngineRunningLow() );
}
void EngineIdle::donw( EngineBox *pEBox )
{
cout << "No Change" << endl;
pEBox->changeState( new EngineIdle() );
}
void EngineIdle::showCurrentState()
{
cout << "State:Idle" << endl;
}
/////////////////////////////////////////////////////////////////////
// EngineRunningLow /////////////////////////////////////////////////
void EngineRunningLow::up( EngineBox *pEBox )
{
cout << "Low -> High" << endl;
pEBox->changeState( new EngineRunningHigh() );
}
void EngineRunningLow::donw( EngineBox *pEBox )
{
cout << "Low -> Idle" << endl;
pEBox->changeState( new EngineIdle() );
}
void EngineRunningLow::showCurrentState()
{
cout << "State:Low" << endl;
}
/////////////////////////////////////////////////////////////////////
// EngineRunningHigh ////////////////////////////////////////////////
void EngineRunningHigh::up( EngineBox *pEBox )
{
cout << "No Change" << endl;
pEBox->changeState( new EngineRunningHigh() );
}
void EngineRunningHigh::donw( EngineBox *pEBox )
{
cout << "High -> Low" << endl;
pEBox->changeState( new EngineRunningLow() );
}
void EngineRunningHigh::showCurrentState()
{
cout << "State:High" << endl;
}
/////////////////////////////////////////////////////////////////////
// main /////////////////////////////////////////////////////////////
void main()
{
EngineBox *pEBox = new EngineBox();
pEBox->up();
pEBox->nowState();
pEBox->up();
pEBox->nowState();
pEBox->down();
pEBox->nowState();
}