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:

Bild