Menurunkan dari Penunjuk Unik Pangkalan kepada Penunjuk Unik Terbitan
Apabila bekerja dengan hierarki dan warisan kelas, mungkin perlu merendahkan penunjuk unik daripada kelas asas kepada kelas terbitan untuk mengakses fungsi tertentu. Ini biasanya ditemui apabila kaedah kilang mengembalikan penuding unik kepada kelas asas tetapi objek sebenar adalah daripada jenis terbitan.
Untuk melakukan downcasting, selalunya disyorkan untuk mengikuti pendekatan dua langkah. Mula-mula, lepaskan objek daripada penuding unik menggunakan kaedah release()nya. Ini membebaskan sumber asas dan mengembalikan penunjuk mentah kepada objek kelas terbitan. Kedua, gunakan fungsi untuk menghantar penuding mentah ke kelas terbitan yang diingini dan menetapkannya semula kepada penuding unik baharu.
Berikut ialah contoh fungsi CastToDerived() yang melakukan downcast selamat:
template<typename Derived, typename Base> std::unique_ptr<Derived> CastToDerived(Base* obj) { return std::unique_ptr<Derived>(static_cast<Derived*>(obj)); }
Fungsi ini boleh digunakan untuk menurunkan daripada penuding unik kelas asas kepada unik kelas terbitan penunjuk:
unique_ptr<Derived> ptr = CastToDerived(DerivedAFactory());
Sebagai alternatif, jika pemutus statik tidak boleh dipercayai, anda boleh menggunakan templat fungsi berikut, yang melaksanakan hantaran statik atau dinamik berdasarkan jenis keselamatan pemutus:
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())); } 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()); }
Fungsi ini memastikan bahawa sumber dilupuskan dengan betul dan penunjuk unik dibina dengan fungsi pemadam yang sesuai.
Atas ialah kandungan terperinci Bagaimana untuk Menurunkan Penunjuk Pangkalan Unik kepada Penunjuk Terbitan Unik dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!