Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan `std::unique_ptr` dengan Jenis Tidak Lengkap dalam C ?

Bagaimanakah Saya Boleh Menggunakan `std::unique_ptr` dengan Jenis Tidak Lengkap dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-07 10:48:13742semak imbas

How Can I Use `std::unique_ptr` with Incomplete Types in C  ?

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 baris 304.

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:

  • Pembina templat: Jika kelas mempunyai pembina templat, pengkompil memerlukan jenis lengkap untuk menentukan kemungkinan pengecualian dalam pembinaan dan cara mengendalikan pemusnahan.
  • Objek tempoh statik: Menggunakan unique_ptr pada skop ruang nama juga mungkin gagal, kerana pengkompil perlu tahu bagaimana untuk memusnahkan objek tempoh statik. Dalam kes sedemikian, penyelesaian adalah untuk menentukan kelas pembantu dengan pemusnah:
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!

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