ページ 11

ステートパターンについて

Posted: 2009年11月17日(火) 22:43
by でんすけ
今現在、「独習 デザインパターン 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();
}

Re:ステートパターンについて

Posted: 2009年11月17日(火) 23:25
by ドラ
EngineBoxクラス内でEngineStateクラスへのポインタを使っていますが、
コンパイラには 識別子EngineState が何なのか理解できていません。
EngineBoxクラスの定義よりも前に class EngineState; を記述して下さい。

他にもエラーは出ますが、単純なものなので修正は簡単だと思います。

Re:ステートパターンについて

Posted: 2009年11月18日(水) 07:24
by でんすけ
返答ありがとうございます。
実は指摘された修正は一度やってみたのですが
そのとき表示されるEngineBoxの構文エラーが理解できず 修正ができませんでした。
説明が足りませんでしたね。

あと EngineBox::up() 内の state->up( this ); と
EngineBox::down() 内の State->down( this ); で
一個の引数を指定できないとでますが、これは前の構文エラーが関係してるのでしょうか?

すみません、まだまだ未熟者なもので・・・
再度 ご指摘いただけたらと思います。
よろしくお願いします。

Re:ステートパターンについて

Posted: 2009年11月18日(水) 14:17
by でんすけ
なんとか解決できました。
ありがとうございました。