Heim > Backend-Entwicklung > C++ > Wie kann man in C einen „unique_ptr' sicher von der Basis auf eine abgeleitete Version umwandeln?

Wie kann man in C einen „unique_ptr' sicher von der Basis auf eine abgeleitete Version umwandeln?

Susan Sarandon
Freigeben: 2024-11-23 11:03:35
Original
824 Leute haben es durchsucht

How to Safely Downcast a `unique_ptr` from Base to Derived in C  ?

So Downcasting eines unique_ptr von Base zu Abgeleitet

In der objektorientierten Programmierung ist es üblich, Klassenhierarchien zu verwenden, um reale Objekte darzustellen. Weltkonzepte. In C erfolgt dies häufig über Vererbung. Durch Vererbung kann eine abgeleitete Klasse die Eigenschaften und das Verhalten ihrer Basisklasse erben.

Eine häufige Anforderung bei der Arbeit mit Klassenhierarchien besteht darin, einen Zeiger auf eine Basisklasse in einen Zeiger auf eine abgeleitete Klasse umzuwandeln. Dieser Vorgang wird als Downcasting bezeichnet.

Im Zusammenhang mit eindeutigen Zeigern kann Downcasting etwas knifflig sein. Dies liegt daran, dass eindeutige Zeiger darauf ausgelegt sind, baumelnde Zeiger und andere Speicherprobleme zu verhindern. Daher können Sie nicht einfach einen static_cast verwenden, um einen unique_ptr in einen anderen Typ zu konvertieren.

Stattdessen müssen Sie eine der folgenden Methoden verwenden:

1. Statische Umwandlung eindeutiger Zeiger

Diese Methode kann verwendet werden, wenn Sie sicher sind, dass der eindeutige Zeiger tatsächlich einen Zeiger auf eine abgeleitete Klasse enthält. Die folgende Funktionsvorlage kann verwendet werden, um eine statische eindeutige Zeigerumwandlung durchzuführen:

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()));
}
Nach dem Login kopieren

2. Dynamische Umwandlung eindeutiger Zeiger

Diese Methode kann verwendet werden, wenn Sie nicht sicher sind, ob der eindeutige Zeiger einen Zeiger auf eine abgeleitete Klasse enthält. Die folgende Funktionsvorlage kann verwendet werden, um eine dynamische Umwandlung eines eindeutigen Zeigers durchzuführen:

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());
}
Nach dem Login kopieren

Beispiel

Der folgende Code zeigt, wie die statische Umwandlung eines eindeutigen Zeigers verwendet wird Konvertieren Sie einen unique_ptr in einen anderen Typ:

#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;
}
Nach dem Login kopieren

In diesem Beispiel erstellen wir einen unique_ptr in ein Basisobjekt. Anschließend verwenden wir die Umwandlung des statischen eindeutigen Zeigers, um den unique_ptr in einen unique_ptr in ein abgeleitetes Objekt umzuwandeln. Dies ist möglich, weil wir wissen, dass der unique_ptr des Basisobjekts tatsächlich einen Zeiger auf ein abgeleitetes Objekt enthält.

Das obige ist der detaillierte Inhalt vonWie kann man in C einen „unique_ptr' sicher von der Basis auf eine abgeleitete Version umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage