Heim >Backend-Entwicklung >C++ >Wie gehe ich beim Kopieren einer Klasse mit eindeutigen Zeigern um?

Wie gehe ich beim Kopieren einer Klasse mit eindeutigen Zeigern um?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-15 16:00:24696Durchsuche

How to Handle Unique Pointers When Copying a Class?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn