Erzwingen von Copy & Assignment Operator-Implementierung
-
Hallo!
Ich habe eine abstrakte Basis-Klasse ("Base"), von der ich 1..n spezialisierte Klassen ableite. Ausserdem gibt es eine "Listen"-Klasse, die alle generierten Objekte in einem std::vector des Types "Base*" sammelt.
Nun moechte ich erzwingen, dass wer auch immer von "Base" erbt, unbedingt sinnvoll einen Copy- und Assignment Operator implementieren muss.
Ich dachte zuerst, ich erstelle die "operator" Methoden virtuell. Dass geht aber nicht, weil ich ja in der Basis-Klasse die Typen der abgeleiteten Klasse nicht kenne. Dann habe ich an ene Template-Methode gedacht, aber das bekomme ich irgendie nicht hin. Nun hoffe ich auf Hinweise von Experten...?!
MfG, Morten.
-
Was heißt sinnvoll implementieren? Du kannst Copy-Ctor und copy-Zuweisungsoperator private machen, dann können copy-ctor und copy-Zuweisung nicht mehr implizit durch den Compiler definiert werden.
-
Hi,
ja ... aber hilft nur wirklich, wenn Du auch erzwingst, dass auch wirklich Kopieraktionen stattfinden ... und dafür fällt mir in der Basisklasse kein Weg ein. Höchstens über eine "Helperfunktion" außerhalb.
Gruß,
Simon2.
-
camper schrieb:
Was heißt sinnvoll implementieren? Du kannst Copy-Ctor und copy-Zuweisungsoperator private machen, dann können copy-ctor und copy-Zuweisung nicht mehr implizit durch den Compiler definiert werden.
Das waere ja schonmal ein Ansatz. Aber die Methoden in der Basisklasse kennen ja nicht den Typ der abgeleiteten Klasse. Mache ich sie also privat (und ggf. virtuell) implementieren Sie ja einen Copy C'tor und Assignment OP fuer "Base". D.h. die abgeleitete Klasse muesste den ebenfalls fuer "Base" implementieren, sie soll es aber natuerlich fuer ihren Typ ("Derived") tun. Deswegen dachte ich an Template Methoden, sowas wie:
class Base { template <typename T> T& operator=(const &T from); };und erzwinge somit fuer "Derived":
class Derived : public Base<Derived> { const Derived& operator=(const &Derived from); };(Ich weiss, dass der Code falsch ist - ich will nur das Prinzip verdeutlichen.)
Naja - vielleicht ist das auch alles zu kompliziert und Mist...?!
MfG, Morten.
-
MortenMacFly schrieb:
Naja - vielleicht ist das auch alles zu kompliziert und Mist...?!
ja. welchen Grund sollte man haben, den Nutzer zu zwingen, diese Funktionen in abgeleiteten Klassen selbst zu deklarieren? ok, für den Zuweisungsoperator fällt mir unter gewissen Umständen etwas ein (Stichwort Exceptionsicherheit) - aber auch dann ist der Grund dafür in Garantien der abgeleiteten Klasse zu finden, der Basisklasse kann es und sollte es völlig egal sein.
-
class base { private: base& operator=(const base&){ copy(); return *this; } protected: virtual void copy() = 0; };