Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat dari Pangkalan kepada Diperoleh dalam C ?

Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat dari Pangkalan kepada Diperoleh dalam C ?

Susan Sarandon
Susan Sarandonasal
2024-11-23 11:03:35747semak imbas

How to Safely Downcast a `unique_ptr` from Base to Derived in 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!

Kenyataan:
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