Angenommen, ich habe eine Klasse namens foo
, die von einer Klasse namens bar
erbt.
Ich habe eine std::unique_ptr
auf eine Instanz von foo
und möchte sie an eine Funktion übergeben, die nur std::unique_ptr<bar>
benötigt. Wie kann ich den Zeiger so konvertieren, dass er in meiner Funktion funktioniert?
Sie können einen std::unique_ptr<foo>
rvalue in ein std::unique_ptr<bar>
konvertieren:
Offensichtlich gehört der Zeiger zu b
und wenn b
zerstört wird bar
muss einen virtual
Destruktor haben.
Wegen der Vererbung ist nichts besonderes erforderlich. Sie müssen std::move
verwenden, um unique_ptr an eine Funktion zu übergeben. Dies gilt jedoch auch dann, wenn die Typen übereinstimmen:
Sie können diese Syntax verwenden:
%Vor% Oder Sie können std::move
verwenden.
Die andere Option besteht darin, einen rohen Zeiger auszugeben, aber Sie müssen eine Funktion ändern:
%Vor%Hier ist ein guter Artikel über intelligente Zeiger und übergibt ihn an Funktionen: Ссылка .
Das geht nicht, weil es gegen die grundlegendste Regel unique_ptr
verstoßen würde: Es muss nur eine Instanz geben, die einen gegebenen Zeiger enthält, und das unique_ptr
hat den vollen Besitz davon (wenn es den Gültigkeitsbereich verlässt) , der Zeiger wird gelöscht).
unique_ptr<T>
und unique_ptr<U>
(wo U : T
) sind nicht kompatibel, wie Sie gesehen haben.
Für shared_ptr
, für die Sie mehrere Instanzen haben können, gibt es std::static_pointer_cast
, das sich genau wie static_cast
verhält, außer dass es eine shared_ptr
akzeptiert und eine andere zurückgibt (und beide auf dasselbe Objekt zeigen) ).
Wenn Sie unbedingt unique_ptr
verwenden müssen, müssen Sie eine Funktion erstellen, die Ihre aktuelle unique_ptr
zuerst verleugnet und diesen Zeiger in eine neue vom richtigen Typ setzt. Möglicherweise müssen Sie nach Ihrem Funktionsaufruf auch die umgekehrte Konvertierung durchführen.