Was bedeutet Warnung?



  • Hallo zusammen,

    ich habe folgende Klassendekleration (Ausschnitt):

    class Klasse{
            private:
    
                Group & group;
                Peer & self;
                cSimpleModule & parent;
    };
    

    Der Konstruktor der Klasse sieht so aus:

    Klasse::Klasse(cSimpleModule & pM, Group & g, Peer & p):parent(pM), self(p), group(g) {
            }
    

    Und bekomme nun folgende Warnings:

    Klasse.h: In constructor ‘A::B::Klasse::Klasse(cSimpleModule&, A::B::Group&, A::B::Peer&)’:
    Klasse.h:52: warning: ‘A::B::Klasse::parent’ will be initialized after
    Klasse.h:50: warning:   ‘A::B::Peer& A::B::Klasse::self’
    Klasse.cc:16: warning:   when initialized here
    

    Wenn ich die Reihenfolge ändere in:

    Klasse::Klasse(cSimpleModule & pM, Group & g, Peer & p):group(g), self(p), parent(pM){...}
    

    ist die Warnung weg. Wieso? Was bedeutet dies? Jemand nen Tip? Danke.


  • Mod

    Die Reihenfolge der Initialisierung der Member einer Klasse hängt von der Reihenfolge ab wie sie in der Klassendefinition stehen. Wenn du in der Initialisierungsliste eine andere Reihenfolge wählst, wird die Reihenfolge der Initialisierung nicht geändert. Der Compiler warnt dich vor dieser Annahme, damit du nicht auf die Idee kommst, Beziehungen zwischen uninitialisierten Objekten herzustellen:

    struct foo
    {
     int a;
     int b;
     foo(int x): a(x), b(a) {}  // Ok.
    };
    
    struct bar
    {
     int a;
     int b;
     foo(int x): b(x), a(b) {}  // Autsch. b ist noch nicht initialisiert, wenn a der Wert b zugewiesen wird -> undefiniertes Verhalten
    };
    


  • Ah!!! Schlauer Compiler. Vielen Dank! 🙂


Anmelden zum Antworten