this in Konstruktor-Initialisierungsliste
-
Hallo!
Der fortgeschrittene C++ Programmierer stelle sich folgende Situation vor:
Es sei eine Klasse A, die als Instanzvariable eine Klasse B als Attribut enthält.
Der Konstruktor der Klasse B benötigt als Parameter eine Referenz auf die Klasse A.Es ist daher notwendig, in der Initialisierungliste des Konstruktors der Klasse A, die Instanzvariable mittels dereferenziertem 'this' zu initialisieren.
Der Compiler gibt hier allerdings eine Warnung aus!
Ich habe mir in einschlägigen IRC Channels sagen lassen, dass die vtable hier noch nicht vollständig initialisiert ist usw.
Welche Probleme könnten hier tatsächlich auftreten, wenn ich diesen Fehler ignoriere?
mfG
Gunther von Hagens
-
Du darfst this nicht dereferenzieren - alles andere ist OK
-
Hi,
es findet ja keine wirkliche Dereferenzierung statt, die Referenz ist ja intern auch ein Pointer. Also dürfte eigentlich nichts schiefgehen, sofern du nicht im Konstruktor von B gleich auf die A-Referenz zugreifst, sondern diese nur speicherst und irgendwann später, wenn A fertig konstruiert wurde, darauf zugreifst.
ChrisM
-
Nein.
*this ist illegal - da das Objekt hinter this noch nicht existiert.
Es wird wahrscheinlich dennoch funktionieren - aber es ist undefiniertes verhalten.
-
Shade Of Mine schrieb:
*this ist illegal - da das Objekt hinter this noch nicht existiert.
Chapter & Verse?
-
Shade Of Mine schrieb:
Nein.
*this ist illegal - da das Objekt hinter this noch nicht existiert.
Es wird wahrscheinlich dennoch funktionieren - aber es ist undefiniertes verhalten.Und warum sagst du hier: http://www.c-plusplus.net/forum/viewtopic.php?t=68965
das du denkst das es OK ist?
-
Warum weiß das hier eigentlich niemand?
-
OK, hab gerade was im Standard gefunden (5.1 - 3):
The keyword this shall be used only inside a nonstatic class member function body (9.3) or in a constructor meminitializer (12.6.2).
-
groovemaster2002 schrieb:
OK, hab gerade was im Standard gefunden (5.1 - 3):
The keyword this shall be used only inside a nonstatic class member function body (9.3) or in a constructor meminitializer (12.6.2).
Hilft hier aber überhaupt nicht weiter.
-
Shade Of Mine schrieb:
Du darfst this nicht dereferenzieren - alles andere ist OK
*this ist illegal - da das Objekt hinter this noch nicht existiert.
Es wird wahrscheinlich dennoch funktionieren - aber es ist undefiniertes verhaltenDas stimmt nicht.
Es ist daher notwendig, in der Initialisierungliste des Konstruktors der Klasse A, die Instanzvariable mittels dereferenziertem 'this' zu initialisieren.
Das ist ok, solange du in B nicht über die Referenz auf ein Member von A zugreifst, bevor der A-Ctor abgelaufen ist. Machst du also nichts weiter, als die Referenz zu binden, dann ist legal und kein Problem.
Warum weiß das hier eigentlich niemand?
Ich hatte bisher keine Zeit/Lust die Frage zu lesen
-
lol schrieb:
Hilft hier aber überhaupt nicht weiter.
Wenn du dir die entsprechenden Stellen im Standard anschaust, wirst du die Antworten finden.