Pointer überprüfen
-
Hallo,
Ich habe in einer Funktion einen Pointer auf ein Steuerelement. Ich weiß allerdings in der Funktion nicht ob es das Steuerelement überhaupt noch gibt oder mit delete gelöscht wurde. Wie kann ich nun herausfinden ob der Pointer noch auf ein gültiges Steuerelement weist. Mit pointer->GetSafeHwnd() funktioniert es auf jeden fall nicht.
Gruß Sebastian
-
Vielleicht mit IsWindow?
Das steht jedenfalls im ASSERT, wenn man auf ein Element vor OnInitDialog zugreift.
-
UB909 schrieb:
Ich weiß allerdings in der Funktion nicht ob es das Steuerelement überhaupt noch gibt
Bevor wir anfangen, uns dafür einen Hack zu basteln, sollten wir erstmal klären, warum du das nicht weisst.
-
setz den pointer auf 0 nach dem löschen mit delete und dann machste einfach:
if (!pointer) { // object ist gelöscht }
-
Also, ich hab in zwei Klassen jeweils einen Pointer auf ein Steuerelement. Wenn jetzt in der 1. Klasse der destruktor aufgerufen wird wird auch das Steuerelement zerstört (da es gar nicht mehr weiter angezeigt werden kann), nur bekommt es die 2.Klasse nicht mit. Und ich kann auch nicht die Verwaltung des Steuerelements in die 2.Klasse verlagern, weil die auch gelöscht werden kann, solange das Steuerelement noch bestehen soll. Und die Anztwort von net funktioniert leider auch nicht, weil sich der Pointer in der 2.Klasse nicht verändert wenn ich den Pointer in der 1. Klasse auf NULL setze...
PS: ISWindow tut auch nicht
-
Wichtig ist auf jedenfall, dass du den Zeiger auf das Steuerelement in eine separate Klasse verpackst. Ich stell mir das ungefähr so vor
// .h class Steuerelement { private: static SteuerelementTyp* instance_; public: SteuerelementTyp* get_object() { // Nullzeiger wird zurueckgegeben, falls das Objekt nicht gültig ist // das muss der Aufrufer natuerlich beachten return instance_; } Steuerelement(SteuerelementTyp* source) { // logischer Fehler -> Zeiger wurde bereits initialisiert assert(!instance_); instance_ = source; } ~Steuerelement() { instance_ = NULL; } }; class Klasse1 { Steuerelement bla; }; class Klasse2 { Steuerelement bla; }; // .cpp SteuerelementTyp* Steuerelement::instance_ = NULL;
Ist zwar jetzt nicht sonderlich toll, aber relativ einfach gemacht und sollte eigentlich ausreichen.
Uu ist es sinnvoll, die Initialisierung und Zerstörung des Steuerelements komplett in der Steuerelement Klasse zu handeln, anstatt in einer der 2 Klassen.
-
thx für die antwort, vom prinzip her müsste sie funktionieren, ich muss jetzt diese Lösung nur noch anpassen..
-
Es funktioniert leider nicht. Sobald ich einen Zugriff auf "instance_" habe bekomm ich ein "Nichtaufgeloestes externes Symbol "private: static class CWnd * CControlManager::instance_".
Weiß jemand woran das liegen könnte?
-
Hast du
CWnd * CControlManager::instance_ = NULL;
in eine ÜE (.cpp) geschrieben und diese mit kompiliert?
-
uups, das hatte ich jetzt übersehen, thx.
jetzt hab ich nur eine Frage. was bewirkt dieser Aufruf genau? und warum funktioniert es nicht ohne?
-
UB909 schrieb:
jetzt hab ich nur eine Frage. was bewirkt dieser Aufruf genau?
Es ist kein Aufruf, sondern einfach die Definition des in CControlManager deklarierten static Members.
UB909 schrieb:
und warum funktioniert es nicht ohne?
Man kann das mit einer Funktion vergleichen. Wenn du so eine lediglich deklariert hast, und dann irgendwo aufrufst, ohne sie zu definieren, dann wird sich spätestens der Linker auch darüber beschweren.
Mehr dazu hier.