Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menurunkan Penunjuk Pangkalan Unik kepada Penunjuk Terbitan Unik dengan Selamat?

Bagaimana untuk Menurunkan Penunjuk Pangkalan Unik kepada Penunjuk Terbitan Unik dengan Selamat?

Mary-Kate Olsen
Lepaskan: 2024-12-03 03:16:10
asal
468 orang telah melayarinya

How to Safely Downcast a Unique Pointer of Base to a Unique Pointer of Derived?

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

Fungsi ini boleh digunakan untuk menurunkan daripada penuding unik kelas asas kepada unik kelas terbitan penunjuk:

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

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

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!

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