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.