Problem mit State Pattern + Forward declaration



  • Hallo,

    bin gerade dabei einen Verkaufsautomaten zu implementieren. Hierbei verwende ich das State Design Pattern.

    Mein Basis-Status (von dem alle konkreten Zustände erben):

    class Context;
    
    class BaseState
    {
       protected:
    	char *description;
    	int identifier;
    
       public:
    
    	virtual ~BaseState();
    	virtual Hardware::VendingMachine::State::BaseState *handle(Context*) = 0;
    	virtual char *toString() = 0;
    	virtual int getStateIdentifier() = 0;
    };
    

    Hier der Aufruf der handle-Methode (des konkreten Zustands) im Kontext (Verkaufsautomat):

    bool Hardware::VendingMachine::Context::stateChanged()
    {
       if (this->currentState)
       {
          this->currentState->handle(this);
          //...
       }
    }
    

    Beim Kompilieren tritt folgender Fehler auf:

    no matching function for call to 'Hardware::VendingMachine::State::BaseState::handle(Hardware::VendingMachine::Context* const)'
    

    Klar ist, dass an dieser Stelle ein Typ wie in der Forward-Declaration mit Hardware::VendingMachine::State::BaseState::Context* angegeben, erwartet wird. Der übergebene this-Zeiger ist jedoch vom Typ Hardware::VendingMachine::Context*

    Habe mich an folgendem Beispiel orientert: http://www.henkessoft.de/Roboter/Nibo.htm#mozTocId872713. Dort funktioniert die ganze State-Pattern-Geschichte augenscheinlich.

    Danke!



  • Keine Lust den Link zu lesen, darum rate ich mal ein bischen was du machst (könnte man auch einfach gekürzt, aber vollständig hier reinschreiben).

    namespace Hardware
    {
    
        namespace VendingMachine
        {
            class Context;
            namespace State
            {
                // class Context; nicht hier
                class BaseState
                {
                public:
                    void Handle(Context*);
                };
            }
            class Context
            {
            public:
                bool stateChanged()
                {
                    if (currentState)
                    {
                        currentState->Handle(this);
                    }
                }
            private:
                State::BaseState* currentState;
            };
        }
    }
    


  • Daran lags. Vielen Dank!! 🙂


Anmelden zum Antworten