Copy-Konstruktor für die Klasse shared_ptr Daten Mitglieder?
Weiß ich, wie schreiben Sie einen kopierkonstruktor, wenn Sie raw-pointer Daten-member in einer Klasse, aber wie schreiben Sie einen kopierkonstruktor, wenn Sie diese handhaben mit einem shared_ptr?
Gibt es eine copy()
oder clone()
Funktion, die aufgerufen werden sollen? Interessanterweise habe ich noch nie gesehen so ein Beispiel.
- Kurze Antwort: können Sie nicht. Der Punkt, der eine
std::shared_ptr<Obj>
ist Ihre gemeinsame. Der default-copy-ctor wird die Verwaltung der Verweiszählung für Sie, wenn Sie die shared pointer Mitglied kopiert. Wenn Sie nicht wollen, um einen shared pointer auf eineObj
, dann verwenden Sie nicht einestd::shared_ptr<Obj>
. Verwenden Sie eineObj
. (Oder vielleicht ich missverstanden Ihre Frage/Anliegen). - Wie @WhozCraig sagt, es ist die automatische. Es sei denn, Sie benötigen eine Art von spezialisierten kopieren Logik für Ihre eigene Klasse, der compiler-generierte default-copy-Konstruktor und Zuweisungsoperatoren arbeiten sollte.
- aber was, wenn Sie wollte, um eine Tiefe Kopie. Die Mitglieder des Objekts freigegebenen Zeiger müssen auch geklont werden, die in der Klasse der copy-Konstruktor.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den copy-Konstruktor für
std::shared_ptr
erstellt einen zweiten Zeiger, die gemeinsame Verantwortung mit dem ersten Zeiger. Der pointee zerstört werden, wenn allestd::shared_ptr
bei, dass es zerstört werden.Ohne Kopie-Konstruktor explizit deklariert werden, die language-Spezifikation verfügt, dass ein passender implizit vorausgesetzt, und es wird rufen Sie die copy-Konstruktoren jedes Mitglied Ihrer Klasse.
So, in anderen Worten, wird der implizite Kopier-Konstruktor für Ihre Klasse nennen
shared_ptr<T>::shared_ptr(const shared_ptr<T> &)
, die erstellen Sie eine zweite Freigabe Zeiger auf das gleiche Objekt, und es sieht nicht aus wie das, was Sie wollen. Wenn Sie möchten, eine Tiefe Kopie des pointee, müssen Sie erklären Ihre eigenen copy-Konstruktor, erstellt:Referenzen:
std::shared_ptr
constructor Dokumentationstd::shared_ptr
hat seine eigenen copy-Konstruktor, übernimmt die Referenzzählung des verwalteten gemeinsamen Daten.Wenn Sie möchten, dass Ihre Klasse die Ressource Eigentum Semantik dann einfach zu erklären, die Ressource als Objekt mit automatischer Speicherung Dauer.