'this' in base member initializer list gefährlich?



  • Hallo.
    Gegeben folgender Code:

    class classA; //forward
    
    class classC {
    public:
        classC(classA* pa) : pa(pa)
    	{
            //init classC...
        }
        classA* pa;
    };
    
    class classB {
    public:
        classB(classC c) : c(c)
    	{
            //init classB...
        }
        classC c;
    };
    
    class classA {
    public:
        classA(): b(classC(this))
    	{
    		//init classA...
    	}
        classB b;
    };
    

    Ist das irgendwie gefährlich?
    (MSVC sagt beim Konstruktor für classA:
    warning C4355: 'this' : used in base member initializer list)



  • Die Frage ist, was du mit dem this dann machst.
    Denn this zeigt noch nicht auf ein fertiges Objekt - folglich darfst du this nicht dereferenzieren.

    Wenn du this aber nur in eine Liste eintragen willst, ist es OK.



  • dort ist *this noch nicht fertig konstruiert. was soll passieren, wen ein anderer ne funktion auf dem objekt aufruft?
    hier mag es zufällig gehen. aber garantieren würde ich das nicht. insbesondere mit virtuellen funktionen hat man immer spaß. hätte classA ne basisklasse, dann wäre zu diesem zeitpunkt der typ von *this die basisklasse.



  • ja, 'this' wird eben wier man sieht als Member pa von classC gespeichert und dann erst später mal verwendet.
    Aber solange ich pa weder in der init von classC noch classB verwende geht doch alles gut (will heissen kein per Standard undefiniertes Verhalten), oder?



  • scrontch schrieb:

    ja, 'this' wird eben wier man sieht als Member pa von classC gespeichert und dann erst später mal verwendet.
    Aber solange ich pa weder in der init von classC noch classB verwende geht doch alles gut (will heissen kein per Standard undefiniertes Verhalten), oder?

    Jo, du darfst mit dem Zeiger machen was du willst, nur nicht dereferenzieren.



  • Shade Of Mine schrieb:

    Jo, du darfst mit dem Zeiger machen was du willst, nur nicht dereferenzieren.

    Ähm..., also später will ich ihn natürlich schon mal dereferenzieren. (Und auch auf ein gültiges Objekt vom Typ classA fallen!, Basisklassen hin- oder her)
    Wichtig ist eben dass der Zeiger seinen Wert (die referenzierte Adresse) nicht während der Initalisierung nochmal ändert?!?



  • Warum sollte er das tun. Du darfst nur während der Kreierung nicht dereferenzieren.


Anmelden zum Antworten