this im Ctor übergeben an Member



  • Guten Abend!

    Ich habe folgende Struktur (vereinfacht):

    class Converter {
    private:
        Database     mDatabase;
    ...
    };
    
    class Database {
    private:
        Converter&  mConverter;
    public:
        Database(Converter& converter) : mConverter(converter) { }
    };
    

    Der Converter hält eine Database und die Database kennt quasi ihren parent Converter.

    Im Ctor vom Converter initialisiere ich nun mDatabase mit this:

    Converter::Converter() :
    mDatabase(*this) { } // Diese Zeile gibt ein Warning
    

    Das führt zu folgendem Warning:

    warning C4355: 'this' : used in base member initializer list

    Ich verstehe das Warning, weil es ja prinzipiell gefährlich ist this im Ctor zu benutzen. Aber in meinem Fall wird es ja ausschließlich zur Initialisierung von Database benutzt und es findet kein Methodenaufruf statt oder so.

    Frage1: Ist der Code in meinem Fall ok?
    Frage2: Wie unterdrücke ich dieses Warning am besten?



  • Weißt bestimmt auf eine Designschwäche hin.



  • BAYvBVB schrieb:

    Frage1: Ist der Code in meinem Fall ok?

    Solange die Referenz niemand verwendet, bevor der Converter vollständig konstruiert ist, ist es ok.

    BAYvBVB schrieb:

    Frage2: Wie unterdrücke ich dieses Warning am besten?

    #pragma warning( disable : 4335 )
    Bleibt anzumerken, daß diese Warnung standardmäßig garnicht aktiviert ist - zumindest nicht in VS 2013.



  • Swordfish schrieb:

    BAYvBVB schrieb:

    Frage1: Ist der Code in meinem Fall ok?

    Solange die Referenz niemand verwendet, bevor der Converter vollständig konstruiert ist, ist es ok.

    BAYvBVB schrieb:

    Frage2: Wie unterdrücke ich dieses Warning am besten?

    #pragma warning( disable : 4335 )
    Bleibt anzumerken, daß diese Warnung standardmäßig garnicht aktiviert ist - zumindest nicht in VS 2013.

    Danke für die Antwort! 🙂 👍


  • Mod

    weil es ja prinzipiell gefährlich ist this im Ctor zu benutzen.

    Nein. Es ist prinzipiell gefährlich this in der Initialisierungsliste zu benutzen. Weil Member oder Basisklassen vor gewissen Zeitpunkten uninitialisiert sind.

    Ist der Code in meinem Fall ok?

    Ja. (Auch wenn du wahrscheinlich einen Tippfehler in der Definition eines Members von Converter hast 😉 )

    Wie unterdrücke ich dieses Warning am besten?

    Kannst du nicht. Vielleicht gibt es ein Pragma welches die Warnung versteckt.

    Edit: Hätte wohl keine Pause machen sollen bevor ich den Post abgeschickt habe...



  • Man kann eine GetThis Memberfunktion machen und dann

    Foo::Foo()
       : m_bar(GetThis())
    

    In diesem speziellen Fall würde ich aber auch sagen: fehldesign.



  • Sowas ist ganz natuerliches Design, brauch ich immer wieder mal. Ergo: Dumme Warning disablen.


Anmelden zum Antworten