Smartpointer und dynamic_cast

8

Ich entschuldige mich im Voraus, wenn das schon beantwortet wurde, als ich schaute und konnte die Antwort nicht finden.

HINWEIS: Diese IS ist eine Hausaufgabe, wenn Sie sich also unwohl fühlen, verstehe ich das.

Ich habe folgendes:

ptr.h:

%Vor%

main.cc:

%Vor%

Nun war es das Ziel, dynamic_cast zu verwenden, um hin und her zu gehen, und obwohl ich viele interessante Leckerbissen über intelligente Zeiger fand, erklärte wirklich nichts, wie wie das implementiert wird.

Ich habe versucht, nur das Adressfeld für pbase zu bekommen und dann pderived auf ein neues Ptr mit dieser Adresse zu initialisieren, aber natürlich sind meine Referenzzählungen alle vermasselt.

Ich habe versucht, ein neues Ptr zu erstellen, das einen Verweis auf den Zähler von pderived enthielt, aber dann konnte ich das Adressfeld von pderived nicht setzen, also blieb ich auch dort stecken.

Ich sage euch diese Informationen, weil: 1. Ich möchte darauf hinweisen, dass ich schon seit einiger Zeit daran arbeite, bevor ich online Hilfe und Hilfe anfordere 2. Ich möchte, dass du weißt, was ich bereits versucht habe.

Ich könnte hier wirklich einen Ratschlag gebrauchen. Wie man es bekommt:

%Vor%

Danke!

    
mlnyc 21.04.2012, 23:16
quelle

1 Antwort

6

In der Regel wird die Smart-Pointer-Klasse einen dynamischen Cast-Wrapper verfügbar machen, der das zugrundeliegende Smart-Pointer-Objekt richtig behandelt. Zum Beispiel hat C ++ 0x die Funktion dynamic_pointer_cast . Beachten Sie, dass Ihr *((Ptr<Derived>*)(dynamic_cast<Ptr<Base>*>(&pbase))); brechen kann, insbesondere wenn Sie mehrfache Vererbung haben, da der innere Zeiger bei address nicht auf den richtigen Offset innerhalb der Unterklasse angepasst wird, um die Oberklasse zu erhalten.

Auf der Implementierungsebene wird eine Refcounting-Smart-Pointer-Klasse normalerweise zwei Zeiger in jedem Smart-Pointer tragen; man zeigt direkt auf das Objekt (korrekt in den Typ des Zeigers gegossen) und zeigt auf eine Struktur, die eine Referenzzählung, einen Zeiger auf das Originalobjekt, und einen Zeiger auf eine Löschroutine enthält . Auf diese Weise kann jede gegossene Variante des Zeigers das ursprüngliche Objekt korrekt zurückrufen und seinen Destruktor aufrufen. Momentan zeigst du direkt auf size_t , was dir diese Information nicht gibt.

Sobald Sie diese Indirektion für den Destruktor haben, können Sie in diesem Fall nur den äußeren -Zeiger erzeugen, wenn es Zeit ist, diese intelligenten Zeiger zu verwenden. diese innere Referenzzählstruktur allein lassen, wenn sich die Zerstörungszeit herumschlägt.

Tatsächlich ist es natürlich eine Übung für den Leser, diesen All-in-Code zu drehen:)

    
bdonlan 21.04.2012, 23:23
quelle