Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat kepada Jenis Terbitan?

Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat kepada Jenis Terbitan?

Susan Sarandon
Lepaskan: 2024-11-17 21:11:02
asal
423 orang telah melayarinya

How to Safely Downcast a `unique_ptr` to a Derived Type?

Cara Melakukan "Downcasting" dengan unique_ptr

Dalam senario pengaturcaraan tertentu, anda mungkin menghadapi keperluan untuk menukar unique_ptr kelas asas kepada unique_ptr kelas terbitan. Ini dikenali sebagai "menghancurkan." Memahami cara melaksanakan operasi ini dengan berkesan adalah penting untuk mengekalkan keselamatan jenis dan mengelakkan kemungkinan ralat.

Pertimbangkan situasi di mana anda mempunyai kilang yang mengembalikan unique_ptr kelas asas. Walau bagaimanapun, kilang ini berfungsi secara dalaman dengan penunjuk kepada pelbagai jenis terbitan, seperti DerivedA, DerivedB dan sebagainya. Anda mungkin memerlukan cara untuk menukar kelas asas yang dikembalikan unique_ptr kepada tahap kelas terbitan tertentu, seperti yang digambarkan dalam pseudokod berikut:

unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());
Salin selepas log masuk

Walaupun pendekatan ini mungkin kelihatan intuitif, ia boleh membawa kepada ralat masa jalan atau tidak dijangka tingkah laku. Penyelesaian yang lebih mantap dan disyorkan melibatkan pelepasan objek daripada kelas asas unique_ptr dan kemudian menghantar penuding mentah kepada jenis terbitan yang diingini, seperti yang ditunjukkan di bawah:

unique_ptr<Derived> CastToDerived(Base* obj) {
    return unique_ptr<Derived>(static_cast<Derived*>(obj));
}
Salin selepas log masuk

Dengan menggunakan teknik ini, anda boleh melakukan downcasting dengan selamat tanpa menjejaskan keselamatan jenis. Walau bagaimanapun, perlu diingat bahawa operasi keluaran harus dilakukan secara eksplisit oleh pemanggil sebelum menggunakan fungsi CastToDerived.

Untuk memenuhi senario di mana kilang berada dalam DLL yang dimuatkan secara dinamik, anda mungkin perlu mempertimbangkan untuk menggunakan templat fungsi seperti static_unique_ptr_cast dan dynamic_unique_ptr_cast. Templat ini memastikan bahawa objek yang dihasilkan dimusnahkan dalam konteks yang sama di mana ia dicipta. Selain itu, mereka menawarkan dua varian pemutus:

  • static_unique_ptr_cast: Gunakan templat ini apabila anda mempunyai kepastian bahawa penunjuk ialah perwakilan yang sah bagi jenis Terbitan.
  • dynamic_unique_ptr_cast: Gunakan templat ini jika anda perlu secara dinamik sahkan bahawa penuding ialah perwakilan yang sah bagi jenis Terbitan melalui dynamic_cast.

Atas ialah kandungan terperinci Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat kepada Jenis Terbitan?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan