StatePattern: Keine Ref. mehr auf konkreten State



  • Hallo Experten,

    ich habe das StatePattern implementiert.
    Mein Context ist die class "Transition", meine konkreten States erben von "TransitionState".
    Ich habe 8 Instanzen der Klasse "Transition" mitihren States am laufen. Nach einer Weile bleibt die Programmausführung stehen.
    Im Debugger habe ich festgestellt, daß eine Transisiton-Instanz nur auf die abstrakte Klasse (also auf die "TransitionState")
    referenziert und nicht mehr auf die konkrete Klasse obwohl diese Transition-Instanz bereits ordnungsgemäß lief.
    Was könnte das Problem sein?
    Danke Euch im voraus!!

    // Context : Transition.h
    
    class TransitionState;
    
    class Transition 
    {
    public:
        Transition(std::string name, int delay, bool gate, bool in1, bool in2);
        ...
        // events
        Event evFalse, evTrue, evBlocked, evTransmit;
    
        // slots
        void in1(bool state);
        void in2(bool state);
        void clearance();
        void gate(bool state);
    
    protected:
    	...
        TransitionState* _pCurrentState;
    
    private:
        ...
    };
    
    // Context : Transition.cpp
    #include "Transition.h"
    #include "StateFalse.h"
    ...
    
    Transition::Transition(std::string name, int delay, bool gate, bool in1, bool in2): ProcessObject(name),
                                                                                                            _delay(delay),
                                                                                                            _gate(gate),
                                                                                                            _in1(in1),
                                                                                                            _in2(in2),
                                                                                                                                                                                                           _clearance(false),
                                                                                                            evFalse{"evFalse"},
                                                                                                            evTrue{"evTrue"},
                                                                                                            evBlocked{"evBlocked"},
                                                                                                            evTransmit{"evTransmit"}
    
    {
        ...
         //Startzustand "False"
        _pCurrentState = new StateFalse(this);
        _pCurrentState->sendSignal(this);
    }
    
    bool Transition::getGateState(){
        return _gate;
    }
    
    int Transition::getDelayTime(){
        return _delay;
    }
    
    bool Transition::getClearance(){
        return _clearance;
    }
    
    void Transition::setCurrentState(TransitionState *pState){
        if (_pCurrentState) {
            delete _pCurrentState;
            _pCurrentState = nullptr;
        }
        _pCurrentState = pState;
        _pCurrentState->sendSignal(this);// Zustandssignal versenden
    }
    
    void Transition::lock(){
        ...
    }
    
    bool Transition::checkTrue(){
        return( _in1 & _in2 & _in3 & _in4);
    }
    
    /*
     * Slots
     */
    void Transition::in1(bool state){
        _in1 = state;
        if (_pCurrentState && state==true) // wirksam nur im State "False"
            _pCurrentState->in1(this);
    }
    
    void Transition::in2(bool state){
        _in2 = state;
        if (_pCurrentState && state==true)
            _pCurrentState->in2(this); // wirksam nur im State "False"
    }
    
    void Transition::clearance(){
        _clearance = true;
        if (_pCurrentState)
            _pCurrentState->clearance(this);
    }
    
    void Transition::gate(bool state){
        if(state){
            _gate = true; // freigeben
            _pCurrentState->gate(this, true); 
        }
        else
            _gate = false; // sperren
    }
    
    // TransitionState.h
    class TransitionState
    {
    public:
        TransitionState();
        virtual void sendSignal(Transition *pT);
        virtual void in1(Transition* pT);
        virtual void in2(Transition* pT);
        virtual void clearance(Transition* pT);
        virtual void gate(Transition* pT, bool state);
    };
    
    // TransitionState.cpp
    TransitionState::TransitionState(){}
    
    void TransitionState::sendSignal(Transition *pT){}
    void TransitionState::in1(Transition *pT){}
    void TransitionState::in2(Transition *pT){}
    void TransitionState::clearance(Transition *pT){}
    void TransitionState::gate(Transition *pT, bool state){}
    


  • Dann wirst du den State wohl gelöscht haben.



  • Ist mir natürlich nicht bewussst wo und wann ich dies mache ...
    Aber ich suche mal danach. Ein Speicherproblem dürfte nicht das sein. Es kommt auch keine Stackoverflow-Meldung oder sonst irgendwas.


Log in to reply