Base Vector sort auf Basis der abgeleiteten Klasse?

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
snapdragon
Beiträge: 28
Registriert: 24.09.2012, 14:49

Base Vector sort auf Basis der abgeleiteten Klasse?

Beitrag 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?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Base Vector sort auf Basis der abgeleiteten Klasse?

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
snapdragon
Beiträge: 28
Registriert: 24.09.2012, 14:49

Re: Base Vector sort auf Basis der abgeleiteten Klasse?

Beitrag von snapdragon »

Ah super danke.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Base Vector sort auf Basis der abgeleiteten Klasse?

Beitrag von dot »

Nur mal so am Rande: Wieso genau shared_ptr!? Die Kinder haben doch wohl nur genau einen Besitzer, nämlich ihren Parent!?
snapdragon
Beiträge: 28
Registriert: 24.09.2012, 14:49

Re: Base Vector sort auf Basis der abgeleiteten Klasse?

Beitrag 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 ;)
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Base Vector sort auf Basis der abgeleiteten Klasse?

Beitrag von eXile »

Ich möchte dann an dieser Stelle den unique_ptr einstreuen.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Base Vector sort auf Basis der abgeleiteten Klasse?

Beitrag 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
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten