Seite 1 von 1
Base Vector sort auf Basis der abgeleiteten Klasse?
Verfasst: 13.11.2012, 14:36
von snapdragon
Ich habe eine Basisklasse Node, von der ich mehrere Subklassen ableite. In Node halte ich mir einen std::Vector mit allen Kind-Elementen als boost::shared_ptr. Nun muss ich in einer Subklasse eine Sortierung der Kinder durchführen, auf Basis eines spezifischen Kind-Members.
Hierfür wollte ich mir eine Comperator-Funktion schreiben, die als Parameter die boost_shared_ptr der Kinder erhält. Ist das überhaupt möglich? Oder muss ich den Comperator auf Basis der Base Klasse schreiben und vor dem eigentlichen Verlgeich ein dynamic_cast auf die Kindklasse durchführen?
Re: Base Vector sort auf Basis der abgeleiteten Klasse?
Verfasst: 13.11.2012, 14:50
von Schrompf
Entweder Du definierst eine virtuelle Vergleichsfunktion in der Basisklasse und benutzt die im Comparator, oder Du musst manuell dynamic_cast machen. Der Comparator selbst geht meist als freundlich-direkte Lambda-Funktion, aber wenn der Code dafür zu lang wird, sieht das hässlich aus.
Re: Base Vector sort auf Basis der abgeleiteten Klasse?
Verfasst: 13.11.2012, 14:52
von snapdragon
Ah super danke.
Re: Base Vector sort auf Basis der abgeleiteten Klasse?
Verfasst: 13.11.2012, 16:34
von dot
Nur mal so am Rande: Wieso genau shared_ptr!? Die Kinder haben doch wohl nur genau einen Besitzer, nämlich ihren Parent!?
Re: Base Vector sort auf Basis der abgeleiteten Klasse?
Verfasst: 13.11.2012, 21:33
von snapdragon
Stimmt, Kinder haben nur einen Parent und selbst wieder 0..n Kinder. Stimme Dir zu Dot, Shared_ptr ist nicht optimal, ist historisch gewachsen.
Wollte ich schon länger mal auf scoped_ptr umstellen, habs aber immer wieder verdrängt. Vielleicht sollte ich Deine Anmerkung mal nutzen, um
etwas aufzuräumen ;)
Re: Base Vector sort auf Basis der abgeleiteten Klasse?
Verfasst: 13.11.2012, 23:06
von eXile
Ich möchte dann an dieser Stelle den unique_ptr einstreuen.
Re: Base Vector sort auf Basis der abgeleiteten Klasse?
Verfasst: 13.11.2012, 23:41
von CodingCat
Die Frage ist, ob C++11 überhaupt eine Option ist. Wenn ja, dann sind Container von
unique_ptr eine gute Wahl. Wenn nein, lassen sich Boosts
scoped_ptr gar nicht so einfach in Container packen und man landet entweder bei Boosts
ptr_container-Wrappern oder bei Containern von
shared_ptr.
Von
dynamic_cast nach Möglichkeit (also praktisch immer) absehen. Im Optimalfall ist es mit einer einfachen virtuellen Methode getan, wie Schrompf sie vorschlägt. Ansonsten gilt:
