Rumah > pembangunan bahagian belakang > C++ > Mengapakah `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap dalam Pimpl Idiom?

Mengapakah `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap dalam Pimpl Idiom?

DDD
Lepaskan: 2024-12-13 05:01:11
asal
456 orang telah melayarinya

Why Does `std::unique_ptr` Fail with Incomplete Types in 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
};
Salin selepas log masuk

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
};
Salin selepas log masuk

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!
}
Salin selepas log masuk

Selain itu, penggunaan unique_ptr dengan jenis yang tidak lengkap pada skop ruang nama gagal:

class impl;
std::unique_ptr<impl> impl_;
Salin selepas log masuk

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_;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan