Die richtige Art und Weise der übertragung von Eigentum an einen std::vector< std::unique_ptr< int> > zu einer Klasse gebaut
Was ist die richtige Art und Weise der übertragung von Eigentum an einem std::vector<unique_ptr<int> >
zu einer Klasse erstellt?
Unten ist ein code-Darstellung, was ich tun möchte. Ich weiß, es ist nicht korrekt (nicht kompiliert) und gegen "Einzigartigkeit" ob ich gehe in den Vektor an den Konstruktor durch einen Wert oder Verweis. Ich möchte, dass Foo der neue Besitzer des Vektors, und wollen, dass die aufrufende Funktion zu verzichten, den Besitz. Muss ich den Konstruktor zu nehmen std::unique_ptr<std::vector<std::unique_ptr<int> > >
zu tun?
Foo.h
class Foo
{
public:
Foo(vector<std::unique_ptr<int> > vecOfIntPtrsOwnedByCaller);
private:
vector<std::unique_ptr<int> > _vecOfIntPtrsOwnedByFoo;
}
Foo.cpp
Foo::Foo(std::vector<std::unique_ptr< int> > vecOfIntPtrsOwnedByCaller)
{
_vecOfIntPtrsOwnedByFoo = vecOfIntPtrsOwnedByCaller;
}
Jede Hilfe wäre sehr geschätzt - ich habe Sie durchforstet das Netz auf der Suche für den richtigen Weg, dies zu tun. Danke!
std::vector<std::unique_ptr<int>>
erfordert entweder eine vorübergehende oder dem Anrufer zu verwendenstd::move
auf Ihre eigenen Vektor -, denn es kann nicht einfach kopiert werden. Wenn Sie möchten, um es wirklich explizit berücksichtigenstd::vector<...>&&
. Danach bewegen Sie in Ihrem Mitglieder - (in der member-Initialisierungen!) mitstd::move
.- Wollen Sie den Vektor eindeutig im Besitz, oder die darin enthaltenen Elemente?
- Helligkeit Rennen im Orbit - Beide.
- Xeo - vielen Dank für Ihre Antwort. Ich bin nur beim Lesen auf rvalue-Referenzen jetzt. Wenn ich Sie richtig verstanden habe, wird der Konstruktor eine rvalue Referenz auf einen vector und Mach _vecOfIntPtrsOwnedByFoo(std::move(vecOfIntPtrsRvalRefence)). Ich bin nicht ganz klar, wie man den Vektor übergeben, in den Konstruktor ein temporäres/rvalue. Die vector-ich bin versucht, übergeben Sie dem Konstruktor ist eine Globale variable von einer anderen Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::unique_ptr<T>
ist eine nicht-kopierbar, aber movable type. Mit einem move-Typ nur in einerstd:vector<T>
machen diestd::vector<T>
bewegen-nur zu. Zu haben, der compiler automatisch die Objekte zu bewegen, müssen Sie haben ein r-Wert für move-Bau-oder move-Zuweisung. In Ihrem Konstruktor das ObjektvecOfIntPtrsOwnedByCaller
ist ein l-Wert, wenn auch eine, die, trotz seines namens, besitzt bereits die Spitzen zuint
s: haben Sie "geklaut", von dem Anrufer, wenn der Anrufer das Objekt erstellt. Um die Bewegung von einem l-Wert benutzen, brauchen Siestd::move()
(oder etwas äquivalentes):oder besser
Letztere Ansatz vermeiden erste Standard-Bau member und dann verschieben-zugewiesen, sondern Sie bewegen sich-Konstrukte, die das Mitglied direkt. Ich denke, ich würde auch machen das argument, eine r-Wert-Referenz, aber dies ist nicht notwendig.
Beachten Sie, dass Sie konstruieren können Objekte vom Typ
Foo
nur von etwas, das gebunden werden kann, zu einem r-Wert, z.B.:Foo(vector<unique_ptr<int>>& v) { this->v.swap(v); }
. Ehrlich gesagt weiß ich Ihre Antwort richtig und besser - aber mitswap
könnte auch ein Weg, um OP ' s Anfrage der "übertragung von Eigentum"?std::vector<...>
'sswap()
würde auch funktionieren, aber mitstd::move()
im member-Initialisierungsliste ist die idiomatischen Weg zur übertragung der Inhalte.&&
nach dem argument-Typ. Weder die Implementierung, noch die Nutzung ändern würde.