Was ist der richtige Weg, um ein std :: unique_ptr in ein std :: unique_ptr in eine Superklasse zu konvertieren?

7

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?

    
merlin2011 23.08.2013, 00:40
quelle

4 Antworten

27

Sie können einen std::unique_ptr<foo> rvalue in ein std::unique_ptr<bar> konvertieren:

%Vor%

Offensichtlich gehört der Zeiger zu b und wenn b zerstört wird bar muss einen virtual Destruktor haben.

    
Dietmar Kühl 23.08.2013, 00:49
quelle
2

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:

%Vor%     
Vaughn Cato 23.08.2013 12:53
quelle
0

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: Ссылка .

    
ghostmansd 23.08.2013 00:51
quelle
-1

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.

    
zneak 23.08.2013 00:46
quelle

Tags und Links