2016-03-29 16 views
0

mit:Verweise auf abgeleiteten Klasse unique_ptr in einem Vektor

std::unique_ptr<base> master_list; 
std::vector<derived*> sub_list; 

, so dass eine Teilmenge von Master_List erstellt durch:

(1) Extrahieren von Master_List Verwendung .get() (2) gegossen zur abgeleiteten Klasse mit dynamic_cast (3) fügen Sie Casted rohe Zeiger zu sub_list (4) Use von sub_list bei Bedarf

sehen Sie einen Fehler in diesem Ansatz? ist es eher besser:

(1) Extrahieren von Master_List Verwendung .get() (2) in Rohzeiger (3) Abrufen von zu SUB_LIST SUB_LIST wenn dynamic_cast

Verwendung (4) mit abgeleiteten Klasse benötigt gegossen
+0

Was ist die Beziehung zwischen "Basis" und "abgeleitet"? Denn wenn es das ist, was Sie vermuten lassen, dann haben Sie entweder Dinge rückwärts oder machen Polymorphismus falsch. –

Antwort

0

Beide Ansätze sehen für mich korrekt aus, solange die dynamic_cast die Logik korrekt behandelt den Fall, dass die dynamic_castnullptr zurückgibt.

Im zweiten Fall bedeutet dies, dass, wenn Sie sich entscheiden, dass Sie etwas brauchen, es tatsächlich nicht da sein kann (wenn dynamic_castnullptr zurückgibt).

Unter der Annahme, dass die nullptr Probleme für beide Ansätze ausgearbeitet werden, hängt der beste Ansatz von Ihrer erwarteten Verwendung von sub_list[i] für Ihren "Durchschnitt" i ab. Wenn erwartet wird, dass fast jedes Mitglied sub_list mehr als einmal verwendet wird, ist es am besten, wie Sie es haben (der erste Weg).

Begründung: dynamic_cast ist nicht frei. Im ersten Ansatz, Sie dynamic_cast einmal für jeden sub_list[i], und dann können Sie es mehrmals verwenden.

Im zweiten Ansatz müssen Sie dynamic_cast einmal pro Verwendung. Dies wird in dem Fall gewinnen, dass Sie Zeiger in sub_list setzen und später entscheiden, sie nicht zu verwenden. Wenn dies viel passiert, können Sie vermeiden, dass dynamic_cast für diese Zeiger verschoben, aber nicht verwendet wird.

Wenn Sie jeden Zeiger, der in sub_list eingegeben wird, immer genau einmal verwenden, sollten die beiden Ansätze in der Leistung (und Korrektheit) identisch sein.

Verwandte Themen