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
Barbara Streisandasal
2024-12-03 00:30:10845semak imbas

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

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

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