というものをやっているのですが、本の内容通りに書いてコンパイルしても
エラーが出てしまいます。
恐らくクラスの順番に問題があるんだと思うのですが、理解出来ずにいます。
ご指摘 頂けないでしょうか。よろしくお願いします。
/* **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(); }