warning C4355: this': wird in Initialisierungslisten für Basisklasse verwendet



  • brotbernd schrieb:

    Zeige Code, den man kompilieren kann und der zu dem besagten Fehler führt. Nicht irgendwas was irgenndwie so ähnlich ist.

    class dialog;
    
    class messagesAnDialog
    {
       public:
          messagesAnDialog(dialog &_dlg) : dlg(_dlg){};
    
       private:
          dialog &dlg;
    };
    
    class dialog
    {
       public:
       	dialog() : mad(*this){}
    
       private:
          messagesAnDialog mad;
    };
    

    Der g++ kompiliert das übrigens ohne Murren, cl vom Visual C++ Express 2008 bringt die genannte Warnung ...



  • volkard schrieb:

    Welche Sprache ist das?

    Welche erwartest Du, wenn Du in einem C++ - Unterforum liest/postest?



  • Belli schrieb:

    volkard schrieb:

    Welche Sprache ist das?

    Welche erwartest Du, wenn Du in einem C++ - Unterforum liest/postest?

    Ach, hier kommt vieles an.
    Und

    class dialog : mad(*this)
    

    sah mir nicht nach C++ aus.
    Hab jetzt total die Lust verloren, zu erklären, wozu die Warnung gut ist.



  • volkard schrieb:

    Hab jetzt total die Lust verloren, zu erklären, wozu die Warnung gut ist.

    Gut, daß das niemand wissen wollte.
    Vielleicht hast Du ja Lust, auf meine Frage (siehe 1. Posting) zu antworten.

    PS Falls nicht, brauchst Du das hier nicht wieder extra kundzutun, einfaches Nicht-Posten hilft in dem Fall, den Thread etwas übersichtlicher zu halten


  • Mod

    Wenn du this in einer Initialisierungsliste benutzt, dann ist das Objekt auf das sich this bezieht noch nicht vollständig initialisiert. Daher die Warnung.



  • Ja kannst du.



  • Icematix schrieb:

    Ja kannst du.

    Danke Dir!
    @SeppJ: Schon klar. Die Frage ist nur, wann ist das von Relevanz für mich, und wann nicht. Da es eine Warnung ist (und kein Fehler), kommt es wohl auf den Kontext an, und da ist mir nicht klar, in welchen Fällen man die Warnung ignorieren kann, und wann man einen echten Fehler produziert ... was in so einem Konstrukt vermutlich dann auch noch ein Fehler ist, der viel später in völlig anderem Zusammenhang zu Problemen führt.



  • Belli schrieb:

    Die Frage ist nur, wann ist das von Relevanz für mich, und wann nicht. Da es eine Warnung ist (und kein Fehler), kommt es wohl auf den Kontext an, und da ist mir nicht klar, in welchen Fällen man die Warnung ignorieren kann, und wann man einen echten Fehler produziert ...

    Es kann beispielsweise zu Fehlern führen, wenn du im Konstruktor von messagesAnDialog noch auf die Referenz zugreift. Die Warnung als solche halte ich auch durchaus für sinnvoll.

    Wobei ich nicht weiß ob "*this" an dieser Stelle wirklich sauber definiert ist, auch wenn diese nur dazu dient als Referenz übergeben zu werden (Ich gehe zwar davon aus, das dies klappt, nur weiß ich nicht ob dies auch vom Standard garantiert wird).



  • Benutzt du den Zeiger im Base Konstruktor ist es schlecht, speicherst du ihn nur in der Basisklasse um ihn später zu benutzen, dann ist es ok. Die Adresse des Objekts ist schon da, das Objekt aber noch nicht initialisiert: Adresse speichern ja, dereferenzieren nein.



  • Ja, soweit habe ich mich an anderer Stelle mittlerweile auch belesen können. In meinem Fall habe ich mit einem Base-Konstruktor allerdings überhaupt nichts zu tun. Ich denke aber, daß das nicht der entscheidende Punkt ist; da mein Objekt noch nicht vollständig initialisiert ist, ist es wahrscheinlich besser, im aufgerufenen Konstruktor-Body die Referenz nicht zu benutzen, egal ob es sich um eine Base-Class meiner Klasse handelt oder nicht.
    Oder aber maximal auf die bereits initialisierten Bestandteile zuzugreifen, die Reihenfolge der Initialisierung ist ja durch die Reihenfolge der Deklaration definiert.

    @asc:
    Ja, darüber habe ich auch nachgedacht. Aber ich hoffe, daß der Speicherbereich für mein Objekt bereits definiert ist und nur die noch uninitialisierten Membervariablen noch nicht befüllt sind.



  • Benutzt du den Zeiger im Base Konstruktor ist es schlecht, speicherst du ihn nur in der Basisklasse um ihn später zu benutzen, dann ist es ok. Die Adresse des Objekts ist schon da, das Objekt aber noch nicht initialisiert: Adresse speichern ja, dereferenzieren nein.

    stimmt schon. Prinzipiell tendiere ich aber dazu es dann lieber gleich ganz zu lassen, weil man spater unter umstaenden "vergessen" hat, wo denn die referenz, die man im Konstruktor kriegt eigentlich herkommt und dann doch mal ploetlich auf die idee kommt zu derefernzieren:

    MyClass( SomeRef& ref )
    {
       //mhh darf ich nun ref benutzen oder nicht...???
    }
    

Anmelden zum Antworten