Rumah > pembangunan bahagian belakang > C++ > Bagaimana Cara Menyalin Kelas C 11 yang Mengandungi Ahli `unique_ptr` dengan Betul?

Bagaimana Cara Menyalin Kelas C 11 yang Mengandungi Ahli `unique_ptr` dengan Betul?

Barbara Streisand
Lepaskan: 2024-12-03 00:30:10
asal
841 orang telah melayarinya

How to Properly Copy C  11 Classes Containing `unique_ptr` Members?

Menyalin Kelas dengan Penunjuk Unik dalam C 11

Mencipta pembina salinan untuk kelas yang mengandungi unique_ptr, penunjuk pintar yang menguatkuasakan pemilikan eksklusif , menimbulkan cabaran yang unik. Dalam C 11, mengurus ahli unique_ptr memerlukan pertimbangan yang teliti.

Penyelesaian:

Untuk melaksanakan pembina salinan, anda mempunyai dua pilihan:

  1. Salinan Dalam: Buat salinan baharu kandungan unique_ptr. Ini memastikan kedua-dua objek memiliki data mereka secara bebas.
class A {
  std::unique_ptr<int> up_;
public:
  A(int i) : up_(new int(i)) {}
  A(const A& a) : up_(new int(*a.up_)) {}
};
Salin selepas log masuk
  1. Tukar kepada shared_ptr: Tukar unique_ptr kepada shared_ptr, yang membenarkan berbilang pemilik.
std::shared_ptr<int> sp = std::make_shared<int>(*up_);
Salin selepas log masuk

Tambahan Pertimbangan:

  • Move Constructor: Daripada pembina salinan, anda boleh menggunakan move constructor, yang memindahkan pemilikan unique_ptr.
A(A&& a) : up_(std::move(a.up_)) {}
Salin selepas log masuk
  • Melebihkan Operator Lain: Untuk satu set operasi yang lengkap, adalah berguna untuk membebankan operator tugasan.
A& operator=(const A& a) { up_.reset(new int(*a.up_)); return *this; }
A& operator=(A&& a) { up_ = std::move(a.up_); return *this; }
Salin selepas log masuk
  • Pertimbangan Vektor: Jika anda berhasrat untuk menggunakan kelas anda dalam std: :vector, tentukan sama ada vektor akan memiliki objek secara eksklusif. Anda boleh menguatkuasakan tingkah laku bergerak sahaja dengan mengetepikan operator pembina salinan dan tugasan salinan.

Atas ialah kandungan terperinci Bagaimana Cara Menyalin Kelas C 11 yang Mengandungi Ahli `unique_ptr` dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan