Zeiger einer Instanz auf eine Andere
-
Hallo zusammen,
ich hätte mal eine Frage zu Zeiger. Ich habe eine Klasse die verschiedene Eigenschaften beherbergt. Unter anderem gehört da auch ein Zeiger vom Typen der Klasse zu mit dem ich auf eine andere Instanz Verweise.
Beispiel:
myClass obj1; obj1.name = "Objekt 1"; myClass *objPointer; { myClass obj2; obj2.name = "Objekt 2"; obj1.partner = obj2; } objPointer = obj1.partner; cout << "Partner von " << obj1.name << " ist " << objPointer.name << endl;Ich weiß, dass dies ein Fehler ist - genau darum geht es. Statt das ich einen SegFault bekomme, endet die Ausgabe einfach hinter dem " ist ". Eigentlich ja logisch, den obj2 gibt es ja nicht mehr, aber müsste ich daher nicht einen SegFault bekommen?
Ich habe es auch mal mit "if (objPointer == NULL)" versucht, aber er geht dann in den False-Zweig. Wo habe ich denn meinen Denkfehler!?
lg,
Funny
-
Hallo
ich glaub dir nicht einmal das der Quellcode so kompiliert
myClass *objPointer; ... objPointer.nameDu hast bei der Ausführung einfach nur "Glück". Es kann auch ganz anders passieren, denn du erzwingst undefiniertes Verhalten.
Das mit dem NULL bringt auf keine Fall etwas, denn du setzt ja selber einen Wert, danach nie wieder auf NULL. Von selbst wird niemals NULL gesetzt.
bis bald
akari
-
Ja du hast recht. Sorry, aber ich habe den Code eben aus dem Kopf zusammen gesetzt, denn ich habe mir entsprechende Methoden gebaut und wollte es hier nur etwas übersichtlicher gestalten.
Im Groben ging es mir nur darum: Habe ich irgendeine Möglichkeit zu prüfen, ob das Objekt, auf das der Zeiger zeigt, wirklich noch eine Instanz der Klasse ist? Oder muss ich im Destruktor der Klasse alle Instanzen der Klasse durchgehen, pürfen ob der Zeige auf die aktuelle Instanz zeigt und diesen den ggf. auf NULL setzten?
-
Hallo
Es gibt keine Möglichkeit zu prüfen ob ein Speicherbereich ein gültiges Objekt enthält oder nicht. Wenn du korrekt programmierst kommt es auch nie zu solchen Fragen. Must du aber doch einen Pointer als nicht mehr gültig markeiren, kannst du ihn auf 0 setzen, um diesen dann darauf prüfen zu können.
bis bald
akari
-
Mit etwas Glück funktioniert ja so etwas:
Klasse* ptr; ... if(dynamic_cast<Klasse*>(ptr)==NULL) cerr<<"Objekt 'ptr' ist ungültig.\n";(aber du solltest dich besser nicht darauf verlassen)
-
Ohje, bei dem Beispiel glaube ich ja doch eher dass er in einer nicht vorhandenen VTable herumspringt und dabei abstürzt

-
Bei der Klasse handelt es sich um ein Objekt, dass einem im einem System eingeloggten User darstellt. Zwei User können Informationen direkt mit einander austauschen. Um die beiden "passenden" Partner schnell finden zu können, würde ich halt gerne mit einem Pointer auf das Objekt zeigen, mit dem der User das letzte mal Daten ausgetauscht hat. So kann ich diesen schnell wieder finden (ist meiner Meinung nach effektiver als den Namen des User abzulegen und diesen dann jedesmal in der map zuschen zu müssen). Aber der Parter kann sich ja ausloggen und dann haben ich oben beschriebenen Zustand.
Also muss ich doch wohl beim ausloggen des User alle Instanzen in der Map durchgehen und den Zeiger auf die aktuelle Instanz auf NULL setzten.
-
CStoll schrieb:
Mit etwas Glück funktioniert ja so etwas:
Klasse* ptr; ... if(dynamic_cast<Klasse*>(ptr)==NULL) cerr<<"Objekt 'ptr' ist ungültig.\n";Ja, und mit "etwas Glück" gewinne ich nächste Woche im Lotto.
