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!
-
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.