Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap dalam Pimpl Idiom?
std::unique_ptr dan Jenis Tidak Lengkap: Pandangan Lebih Dalam
Pertimbangkan simpulan bahasa pimpl yang menggunakan std::unique_ptr:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
Walau bagaimanapun, ralat penyusunan timbul disebabkan oleh jenis tidak lengkap:
"Aplikasi 'sizeof' tidak sah pada jenis tidak lengkap 'uixx::window::window_impl'"
Secara tradisinya, std::unique_ptr serasi dengan jenis yang tidak lengkap. Jadi, di manakah letaknya isunya?
Inti Perkara: Kemusnahan
Kuncinya terletak pada kemusnahan. Jika pimpl digunakan dengan unique_ptr, pemusnah mesti diisytiharkan secara eksplisit:
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // Constructor may need external definition ~foo(); // Implement (braceless or with = default;) once impl is complete };
Jika tidak, pengkompil menjana pemusnah lalai yang memerlukan pengisytiharan lengkap foo::impl.
Masalah Templat dan Kejadian Statik
Dengan templat pembina, komplikasi timbul walaupun ahli impl_ tidak dibina:
template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction at compile time! }
Selain itu, penggunaan unique_ptr dengan jenis yang tidak lengkap pada skop ruang nama gagal:
class impl; std::unique_ptr<impl> impl_;
Pengkompil perlu mengetahui cara untuk musnahkan objek tempoh statik ini. Penyelesaian melibatkan penentuan jenis tersuai:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
Atas ialah kandungan terperinci Mengapakah `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap dalam Pimpl Idiom?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!