Initialisierungsliste und Zeiger
-
Wie verwendet man Zeiger in Initialisieurngslisten?
Kann man sowas schreiben wie
class Zeiger; class tolle_klasse { Zeiger* zeiger; } tolle_klasse::tolle_klasse(): zeiger(new zeiger()){}?
-
Da spricht meiner Meinung nach nichts dagegen.
-
Mann könnte dir hier die Antwort sagen. Aber! Vorschlag. Probier es aus. Wenn du es selbst probierst behältst du es besser
-
sirchillalot schrieb:
Mann könnte dir hier die Antwort sagen. Aber! Vorschlag. Probier es aus. Wenn du es selbst probierst behältst du es besser
der hat mir grad etwas meiner meinung nach unmögliches durchgehn lassen:
class zeiger { int a; zeiger(int _a); } class nutzer { zeiger* x; nutzer(): zeiger(){}deswegen die frage,
nochmal grundlagen-ffrage am rande:muss man konstruktoren auch virtuell anlegen wenn man vererben will und polymorphie braucht?
finde hier nur beispiele von virtuellen funktionen, destruktor ist mir klar aber konstruktor?!
-
shisha schrieb:
Kann man sowas schreiben wie
class Zeiger; class tolle_klasse { Zeiger* zeiger; } tolle_klasse::tolle_klasse(): zeiger(new zeiger()){}Klar kann man das schreiben, du hast es ja schon geschrieben

Der Compiler wird es auch schlucken.
Und es wird auch das passieren was du erwartest.
So lange bis du mehrere Zeiger auf die Weise initialisierst und bei einem davon eine Exception fliegt, Bsp:class LeakCreator { NormalClass* pn; ExceptionThrowingBatard* pb; LeakCreator() : pn(new NormalClass()) , pb(new ExceptionThrowingBastard()) {} ~LeakCreator() { delete pb; delete pn; } };Was passiert hier? pn wird ganz normal initialisiert, d.h. es wird ein neues Objekt vom Typ NormalClass erzeugt und pn zeigt darauf. Bei der Initialisierung von pb schmeißt der Konstruktor von ExceptionThrowingBastard wie erwähnt eine Exception. Gottseidank wird der von
operator newbereits besorgte Speicher dann wieder freigegen, die Exception segelt allerdings weiter, heraus aus dem Ctor von LeakCreator. Da jetzt aber der Konstruktor-Rumpf nie erreicht wurde, d.h. die Initialisierung nie vollständig erfolgt ist, wird auch der Destruktor nicht aufgerufen. pn geht einfach verloren und wenn der Rechner nicht gestorben ist, lebt die NormalClass-Instanz noch heute.
-
shisha schrieb:
der hat mir grad etwas meiner meinung nach unmögliches durchgehn lassen:
...Was ist daran deiner Meinung nach nicht möglich?
nochmal grundlagen-ffrage am rande:
muss man konstruktoren auch virtuell anlegen wenn man vererben will und polymorphie braucht?
finde hier nur beispiele von virtuellen funktionen, destruktor ist mir klar aber konstruktor?!
Konstruktoren können nicht virtuell sein. Zum Zeitpunkt der Konstruktion gibst du ja auch nicht den Basisklassentyp an sondern den tatsächlichen Typ den du erzeugst.