Wie funktioniert boost::noncopyable
-
Hallo,
wenn ich privat von noncopyable ableite, dann ist die Klasse ja nicht mehr kopierbar. Aber wieso eigentlich? Also wie funktioniert das technisch?
-
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin
keine 10 Sekunden google Suche
-
Shade Of Mine schrieb:
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin
keine 10 Sekunden google Suche
Wirklich weitergebracht hat mich der Artikel nicht. Meine 2 größten Fragen:
- Wieso ist der Ctor und Dtor protected und nicht private oder public?
- Da steht das CantCopy nicht kopiert werden kann, weil der CopyCtor und operator= von NonCopyable nicht zugreifbar sind. Aber ich könnte doch zb. in CantCopy einen public CopyCtor schreiben, der explizit den Default Ctor von NonCopyable aufrufen (der ist ja protected und damit zugreifbar)
-
Ich würde mal sagen wenn du von nonCopyable erbst und dann nen Copykonstruktor zur Verfügung stellst ... selbst schuld

-
noncopyable22 schrieb:
- Wieso ist der Ctor und Dtor protected und nicht private oder public?
- nicht private: Damit du ein Objekt deiner erbenden Klasse erstellen kannst.
- nicht public: Damit du keine konkrete Objektinstanz erstellen kannst.
-
SeppJ schrieb:
noncopyable22 schrieb:
- Wieso ist der Ctor und Dtor protected und nicht private oder public?
- nicht private: Damit du ein Objekt deiner erbenden Klasse erstellen kannst.
- nicht public: Damit du keine konkrete Objektinstanz erstellen kannst.Du meinst keine konkrete Objektinstanz von noncopyable?
Also sehe ich das richtig, dass wenn ich in meiner abgeleiteten Klasse einen CopyCtor anbiete und explizit den Default Ctor von noncopyable aufrufe, ich effektiv den noncopy Mechanismus ausheble?
Und was hat es mit dem privaten operator= auf sich? Ich dachte Operatoren werden nicht vererbt?
-
Genau wie beim Copy-Ctor...
Der operator = kann nur generiert werden, wenn alle Basisklassen und Member einen erreichbaren operator = haben (oder eingebaute Typen sind).
Der private operator = verhindert also dass für die abgeleitete Klasse ein operator = erstellt wird.Also sehe ich das richtig, dass wenn ich in meiner abgeleiteten Klasse einen CopyCtor anbiete und explizit den Default Ctor von noncopyable aufrufe, ich effektiv den noncopy Mechanismus ausheble?
Ja, was auch vollkommen OK ist.
-
noncopyable22 schrieb:
Also sehe ich das richtig, dass wenn ich in meiner abgeleiteten Klasse einen CopyCtor anbiete und explizit den Default Ctor von noncopyable aufrufe, ich effektiv den noncopy Mechanismus ausheble?
Ja, weil du damit quasi sagst "ich will nicht, dass Objekte dieser Klasse kopiert werden können. Ich will aber, dass Objekte dieser Klasse kopiert werden können". Sinnfrei, oder?
Und was hat es mit dem privaten operator= auf sich? Ich dachte Operatoren werden nicht vererbt?
Nein, aber automatisch generiert, zumindest op=. Die automatische Generierung erfolgt so, dass einfach für alle Member und Basisklassen op= aufgerufen wird. Noncopyable verhindert das, weil dessen op= eben nicht aufgerufen werden kann.