Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat dari Pangkalan kepada Diperoleh dalam C ?
Cara Menurunkan unique_ptr dari Base ke Derived
Dalam pengaturcaraan berorientasikan objek, adalah perkara biasa untuk menggunakan hierarki kelas untuk mewakili real- konsep dunia. Dalam C , ini selalunya dilakukan menggunakan pewarisan. Warisan membenarkan kelas terbitan mewarisi sifat dan gelagat kelas asasnya.
Satu keperluan biasa apabila bekerja dengan hierarki kelas ialah menukar penuding kepada kelas asas kepada penuding kepada kelas terbitan. Proses ini dikenali sebagai downcasting.
Dalam konteks petunjuk unik, downcasting boleh menjadi agak rumit. Ini kerana penunjuk unik direka untuk mengelakkan penunjuk berjuntai dan isu ingatan lain. Akibatnya, anda tidak boleh hanya menggunakan static_cast untuk menukar unique_ptr kepada jenis yang berbeza.
Sebaliknya, anda mesti menggunakan salah satu kaedah berikut:
1. Cast Penunjuk Unik Statik
Kaedah ini boleh digunakan apabila anda pasti bahawa penuding unik sebenarnya mengandungi penuding kepada kelas terbitan. Templat fungsi berikut boleh digunakan untuk melakukan hantaran penunjuk unik statik:
template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> static_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) { auto d = static_cast<Derived *>(p.release()); return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter())); }
2. Cast Penunjuk Unik Dinamik
Kaedah ini boleh digunakan apabila anda tidak pasti bahawa penunjuk unik mengandungi penuding kepada kelas terbitan. Templat fungsi berikut boleh digunakan untuk melakukan hantaran penunjuk unik dinamik:
template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> dynamic_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) { if (Derived *result = dynamic_cast<Derived *>(p.get())) { p.release(); return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter())); } return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter()); }
Contoh
Kod berikut menunjukkan cara menggunakan hantaran penuding unik statik untuk tukar unique_ptr kepada jenis yang berbeza:
#include <memory> class Base { public: virtual ~Base() {} }; class Derived : public Base { public: ~Derived() {} }; int main() { std::unique_ptr<Base> uptr = std::make_unique<Derived>(); std::unique_ptr<Derived> dptr = static_unique_ptr_cast<Derived>(std::move(uptr)); return 0; }
Dalam contoh ini, kami mencipta unique_ptr kepada objek Base. Kami kemudian menggunakan hantaran penuding unik statik untuk menukar unique_ptr kepada unique_ptr kepada objek Terbitan. Ini mungkin kerana kita tahu bahawa unique_ptr kepada objek Base sebenarnya mengandungi penunjuk kepada objek Terbitan.
Atas ialah kandungan terperinci Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat dari Pangkalan kepada Diperoleh dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!