Menggunakan std::unique_ptr dengan Jenis Tidak Lengkap
Dalam simpulan bahasa pimpl, menggunakan std::unique_ptr dengan jenis yang tidak lengkap boleh membawa kepada kompilasi kesilapan. Pertimbangkan kod berikut:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
Ralat biasanya timbul daripada cubaan menggunakan sizeof pada jenis yang tidak lengkap, seperti yang dilihat dalam
Masalahnya
Isu ini berpunca daripada fakta bahawa pengkompil perlu mengetahui saiz jenis yang tidak lengkap untuk menentukan peruntukan untuk std:: unique_ptr. Maklumat ini tidak tersedia, mengakibatkan ralat penyusunan.
Penyelesaian
Untuk menangani masalah ini, adalah penting untuk melaksanakan pemusnah untuk kelas yang memegang unique_ptr. Ini kerana pemusnah lalai yang dihasilkan oleh pengkompil memerlukan pengisytiharan lengkap jenis tersebut. Berikut ialah contoh:
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // You may need a def. constructor to be defined elsewhere ~foo(); // Implement (with {}, or with = default;) where impl is complete };
Dengan melaksanakan pemusnah, pengkompil memperoleh pengetahuan yang diperlukan untuk menangani pemusnahan_ptr yang unik.
Kes Khas
Dalam senario tertentu, menggunakan unique_ptr dengan jenis yang tidak lengkap mungkin tidak mungkin:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
Dengan mengikut garis panduan ini, anda boleh menggunakan unique_ptr dengan jenis yang tidak lengkap dengan berkesan, memastikan proses penyusunan lancar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan `std::unique_ptr` dengan Jenis Tidak Lengkap dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!