std::unique_ptr dengan Ralat Penyusun Jenis Tidak Lengkap
Kelas std::unique_ptr direka bentuk untuk mengurus jangka hayat objek dan ia boleh digunakan dengan kedua-dua jenis lengkap dan tidak lengkap. Walau bagaimanapun, apabila cuba mengisytiharkan std::unique_ptr dengan jenis yang tidak lengkap, seperti yang dilihat dalam coretan kod di bawah:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
ralat penyusunan mengenai penggunaan jenis yang tidak lengkap mungkin berlaku. Ralat ini berpunca daripada fakta bahawa apabila menggunakan pimpl dengan std::unique_ptr, pemusnah mesti diisytiharkan:
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 };
Jika pemusnah tidak diisytiharkan secara eksplisit, pengkompil menjana satu lalai, yang memerlukan pemusnah yang lengkap pengisytiharan kelas foo::impl. Ini boleh membawa kepada ralat penyusunan apabila bekerja dengan jenis yang tidak lengkap.
Untuk menyelesaikan isu ini, laksanakan pemusnah untuk kelas, sama ada dengan badan kosong atau dengan menetapkannya kepada lalai, seperti yang dilihat dalam coretan kod di atas. Ini akan memastikan bahawa pengkompil boleh mengendalikan pemusnahan objek yang diuruskan oleh std::unique_ptr dengan betul.
Selain itu, menggunakan std::unique_ptr dengan jenis yang tidak lengkap tidak disokong pada skop ruang nama. Sebaliknya, penyelesaian tersedia dengan membungkus std::unique_ptr dalam struct tersuai yang menyediakan pemusnah, seperti yang ditunjukkan dalam coretan kod di bawah:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
Atas ialah kandungan terperinci Mengapakah Menggunakan `std::unique_ptr` dengan Jenis Tidak Lengkap Menyebabkan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!