Kopieren eines eindeutigen Zeigers in einer Klasse
Das Kopieren einer Klasse, die als Mitglied einen eindeutigen Zeiger enthält, erfordert besondere Überlegungen. Ein eindeutiger Zeiger kann nicht gemeinsam genutzt werden, was entweder eine tiefe Kopie seines Inhalts oder eine Konvertierung in einen gemeinsam genutzten Zeiger erfordert.
Deep Copying
Der Deep-Copy-Ansatz erstellt einen neuen eindeutigen Zeiger und initialisiert ihn mit einer Kopie des Inhalts des ursprünglichen Zeigers:
class A { std::unique_ptr<int> up_; public: A(int i) : up_(new int(i)) {} A(const A& a) : up_(new int(*a.up_)) {} };
Hier der Kopierkonstruktor von A deep kopiert den int, auf den der ursprüngliche eindeutige Zeiger zeigt.
Konvertierung in einen gemeinsam genutzten Zeiger
Alternativ können Sie den eindeutigen Zeiger in einen gemeinsam genutzten Zeiger konvertieren, was dies ermöglicht zur gemeinsamen Nutzung durch mehrere Objekte:
class B { std::unique_ptr<int> up_; public: B(int i) : up_(new int(i)) {} B(const B& b) { up_ = std::make_shared(*b.up_); } };
In diesem Beispiel konvertiert der Kopierkonstruktor von B den eindeutigen Zeiger in einen gemeinsam genutzten Zeiger, der es mehreren Kopien von B ermöglicht, auf dieselben zugrunde liegenden Daten zuzugreifen.
Andere Operatoren
Um nahtlos mit Containern wie std::vector zu arbeiten, sind normalerweise zusätzliche Operatoren erforderlich erforderlich:
Umzug Konstrukteur:
B(B&& b) { up_ = std::move(b.up_); }
Aufgabe kopieren:
B& operator=(const B& b) { up_ = std::make_shared(*b.up_); return *this; }
Verschieben Zuweisung:
B& operator=(B&& b) { up_ = std::move(b.up_); return *this; }
Diese Operatoren sorgen dafür, dass Objekte in verschiedenen Kontexten sicher zugewiesen und kopiert werden können.
Das obige ist der detaillierte Inhalt vonWie gehe ich beim Kopieren einer Klasse mit eindeutigen Zeigern um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!