Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengendalikan Penunjuk Unik Semasa Menyalin Kelas?

Bagaimana Mengendalikan Penunjuk Unik Semasa Menyalin Kelas?

Patricia Arquette
Patricia Arquetteasal
2024-12-15 16:00:24703semak imbas

How to Handle Unique Pointers When Copying a Class?

Menyalin Penunjuk Unik dalam Kelas

Menyalin kelas yang mengandungi penunjuk unik sebagai ahli memerlukan pertimbangan khusus. Penunjuk unik tidak boleh dikongsi, yang memerlukan sama ada salinan mendalam kandungannya atau penukaran kepada penuding dikongsi.

Penyalinan Dalam

Pendekatan salinan mendalam mencipta penuding unik baharu dan memulakannya dengan salinan kandungan penuding asal:

class A
{
   std::unique_ptr<int> up_;

public:
   A(int i) : up_(new int(i)) {}
   A(const A& a) : up_(new int(*a.up_)) {}
};

Di sini, A's copy constructor deep menyalin int yang ditunjuk oleh penuding unik asal.

Penukaran kepada Penunjuk Dikongsi

Sebagai alternatif, anda boleh menukar penuding unik kepada penuding dikongsi, yang membolehkannya dikongsi antara berbilang objek:

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_);
   }
};

Dalam contoh ini, salinan B pembina menukar penuding unik kepada penuding dikongsi, membolehkan berbilang salinan B untuk mengakses data asas yang sama.

Operator Lain

Untuk berfungsi dengan lancar dengan bekas, seperti std ::vektor, pengendali tambahan biasanya diperlukan:

  • Move Constructor:

    B(B&& b)
    {
     up_ = std::move(b.up_);
    }
  • Salin Tugasan:

    B& operator=(const B& b)
    {
     up_ = std::make_shared(*b.up_);
     return *this;
    }
  • Bergerak Tugasan:

    B& operator=(B&& b)
    {
     up_ = std::move(b.up_);
     return *this;
    }

Pengendali ini memastikan objek boleh ditugaskan dan disalin dengan selamat dalam pelbagai konteks.

Atas ialah kandungan terperinci Bagaimana Mengendalikan Penunjuk Unik Semasa Menyalin Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn