swap implementerungsfrage
-
hallo
angenommen es existiert eine basisklasse b und eine abgeleitete klasse d (die von b öffentlich erbt). nun da in d eine menge daten sind, ich aber nicht auf das copy-and-swap-idiom verzichten möchte, implementiere ich meine eigene swap-funktionen. wie kann ich in einer swap-member-funktion die basisklassen swappen? gibt es dafür überhaupt eine schöne darstellung? oder muss man einen manuellen dreieckstausch mit slicing machen?
mfg
-
struct B {}; struct D : B { void swap(D& other) { std::swap( *static_cast<B*>(this), static_cast<B&>(other) ); } };Das geht syntaktisch sicher schöner, aber auf die Schnelle will mir nichts einfallen.
(Übrigens: Wieso keineswap-Memberfunktion in der Basisklasse?)
-
std::swap<B>(*this, other);sollte gehen, denke ich.
-
Nachtrag: Aber vermutlich suchtest du eher
struct B { virtual void swap(B &other) { ... } }; struct D : B { void swap(D& other) { B::swap(other); } };
-
@seldon: Das ist doch Unfug! Das
swapin D hat doch gar nicht dieselbe Signatur, und C++ unterstützt keine kovarianten Funktionsparameter!Edit: Oder du machst das
swap virtual, da in abgeleiteten Klassen dasswapmit der Basisklasse redefiniert werden könnte. Fände ich aber merkwürdig.
-
Das Livkovsche Substitutionsprinzip sagt Nein.
struct B { virtual void swap(B &other) { ... } }; struct D : B { ///lalalala }; struct E : B { ///lalalala }; //... E e; D d; e.swap(d);//???
-
die basisklasse habe nicht ich geschrieben sondern der anbieter einer library und der hat leider nicht so viel wert darauf gelegt. und ich kann das natürlich auch nicht ändern. ich werde heute abend mal den ersten und den zweiten vorschlag ausprobieren und mich dann nochmals melden.