Implementieren von Kopierkonstruktoren für Klassen mit unique_ptr-Mitgliedern
Bei der Arbeit mit Klassen, die eine unique_ptr-Mitgliedsvariable verwenden, ist die Implementierung eines Kopierkonstruktors von entscheidender Bedeutung. In diesem Artikel befassen wir uns mit den Techniken zum Erstellen von Kopierkonstruktoren in C 11 für solche Klassen.
Da „unique_ptr“ nicht gemeinsam genutzt werden kann, ist es unbedingt erforderlich, den Inhalt entweder tief zu kopieren oder in einen „shared_ptr“ zu konvertieren. Das folgende Beispiel zeigt Deep Copying:
class A { std::unique_ptr<int> up_; public: A(int i) : up_(new int(i)) {} A(const A& a) : up_(new int(*a.up_)) {} };
Bei diesem Ansatz wird ein neuer unique_ptr zugewiesen und ihm wird eine Kopie des Inhalts des ursprünglichen Zeigers zugewiesen.
Alternativ kann man stattdessen einen Verschiebungskonstruktor verwenden eines Kopierkonstruktors:
A(A&& a) : up_(std::move(a.up_)) {}
Diese Methode führt jedoch eine andere Semantik ein, da sie den Besitz des kopiert unique_ptr von der Quelle zum Zielobjekt.
Der Vollständigkeit halber wäre der vollständige Satz von Zuweisungsoperatoren:
A& operator=(const A&a) { up_.reset(new int(*a.up_)); return *this; } A& operator=(A&& a) { up_ = std::move(a.up_); return *this; }
Die Entscheidung, ob Kopier- oder Verschiebungskonstruktoren verwendet werden sollen, hängt vom Kontext ab. Wenn die Klasse in einem std::vector verwendet werden soll, wird die Wahl, ob die Klasse nur verschoben oder kopiert werden soll, davon beeinflusst, ob der Vektor der alleinige Eigentümer der Objekte sein soll.
Das obige ist der detaillierte Inhalt vonWie implementiert man Kopierkonstruktoren für Klassen mit „unique_ptr'-Mitgliedern in C 11?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!