std::unique_ptr Versuch zum Verweis auf eine gelöschte Funktion
Ich habe auf Unity schon eine ganze Weile und kam zurück, um einige C++ unter Verwendung von Visual Studio 2015. Ich kam in dieser Klasse definition
class A
{
public:
A();
virtual ~A();
A(const A&) = delete;
A& operator=(const A&) = delete;
private:
…
}
Diese Klasse wird dynamisch zugewiesen, wie die folgenden:
ObjPtr obj = ObjPtr(new A());
wo ObjPtr
ist eine Art definiert und wie folgt aussieht:
typedef std::unique_ptr<A> objPtr;
hinzufügen und diese erstellte Objekte verwenden, um eine std::vector<ObjPtr>
mit std::move
. An einer Stelle, die ich brauche, um eine Schleife durch die Liste der Objekte, und wenn ich etwas finden, das erfüllt meine Kriterien, eine Kopie davon zu halten.
ObjPtr keep;
for(auto& object : GetObjectList() )
{
if(/*check if its the object I want*/)
{
keep = object;
}
}
Wo GetObjectList gibt eine const std::vector<ObjPtr>&
.
Aber ich bin immer ein "Versuch zum Verweis auf eine gelöschte Funktion". Ich habe einige googeln und versucht zu entfernen, die = delete
Teil und sagte sogar die 2 Zeilen aus. Ich habe sogar versucht zu tun
ObjPtr keep = std::move(object);
Aber ich bin noch immer die Funktion gelöscht Fehler. Kann jemand sehen, was ich falsch mache oder zeigen Sie mir einige Ressourcen, die helfen können?
- Was ist der Typ von
ObjectList
? - Meinen Beitrag aktualisiert!
- Sind Sie sicher, dass
ObjectList
ist nichtconst
? - Nicht reproduzieren. Stellen Sie sicher, dass auch Sie verwenden
keep = std::move(object);
. keep = std::move(object);
verlassen würde, einen Toten Zeiger im vector.- Aktualisiert die post. Ja, es ist ein const
- "einzigartig" ptr
- Gut es gibt Sie. Sie können sich nicht bewegen, aus der eine Konstante eindeutige Zeiger. Auch, wie viele andere sagen, das ist nicht, wie
unique_ptr
beabsichtigt wurde, verwendet werden. - Warum sollte es ein problem sein? Die
unique_ptr
move-Konstruktor tut seine Arbeit. Vielleicht verstehe ich nicht, was Sie sagen. - Was würde das lassen, in den Vektor?
- Ein
unique_ptr
verschoben wurde, aus. Das Eigentum übertragen wurde außerhalb des Vektors, ist es nicht? - Recht, das scheint nicht das zu sein, was der OP will. Es gibt keine Beweise, er will den Vektor zu verlieren Besitz des Objekts.
- ein Objekt in einem gültigen, aber unbekannter Zustand? (17.6.5.15). Das ist, warum ich sagte, dass ich wahrscheinlich nicht verstehen, was genau wollen Sie sagen. IMO ist es völlig in Ordnung zu sinken
unique_ptr
's in Behältern und verschieben Sie Sie zurück, solange Sie wissen, was Sie tun. Ahh OK ich hab jetzt das Ende Ihres Kommentars. Ja, ich bin einverstanden. Für einen moment dachte ich, ich kann gelernt haben, etwas eklatant falsch unique_ptr ist, und dass Sie sich nicht bewegen kann Sie in Behälter. Aber jetzt ist es klar, was Sie meinte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
std::unique_ptr
kann nicht kopiert werden. Auch wenn das verwaltete Objekt könnte (aber Sie nicht).Haben Sie ein paar alternativen (mit unterschiedlichen Auswirkungen):
Ändern Sie die Art der
keep
zu einer nicht-besitzenden raw-pointer (akaA *
) und verwendenkeep = object.get();
. Dies ist sicher, wenn und nur wenn Sie wissen, dass Sie nicht verwendenkeep
mehr alsObjectList
(oder, genauer gesagt, das Objekt, nehmen Sie die-Adresse) vorhanden ist.Bewegen Sie den
std::unique_ptr
aus dem Behälter, das heißt, verwenden Siekeep = std::move(object);
. Natürlich, Sie haben jetzt eine Lücke inObjectList
. (Mir ist klar das du bearbeitet haben, Ihre Frage zu sagen, dassObjectList
istconst
was bedeutet, dass Sie nicht ändern können und daher nicht verschieben von Objekten aus ihm heraus.)Ändern Sie die Art der
ObjPtr
zustd::shared_ptr<A>
wenn Sie möchten, ein geteiltes Eigentum Semantik.Wenn Sie wollen unbedingt ein kopieren des Objekts, man könnte hinzufügen, ein
virtual
member-Funktion zuA
dass die Klone das Objekt polymorph.Du dann implementieren, dass die Funktion in jedem Blatt
class
abgeleitet vonA
. In deiner Schleife, die Sie dann verwendenkeep = object->clone();
. Für diese, werden Sie wahrscheinlich wollen, um die Kopie-Konstruktorprotected
aber nichtdelete
es.Nicht verwenden
keep = std::make_unique<A>(*object);
weil es würde dann nicht die tatsächliche (dynamische) Typ des Objekts und immer Scheibe zu einemA
. (Da IhrA
ist nicht kopierbar, es würde nicht funktionieren, sowieso.)Was macht eine einzigartige Zeiger "einzigartig" ist, dass es können nur existieren, ein solcher Zeiger auf ein Objekt. Wenn Sie eine Kopie von ein eindeutiger Zeiger, hätten Sie zwei Dinge, die jeder im Besitz des zugrunde liegenden Objekts. Wenn jeder war zerstört, das Objekt würde zerstört werden, was zu einer doppelten löschen.
Wenn Sie müssen mehrere Eigentumsverhältnisse, verwenden Sie eine
shared_ptr
. Wenn Sie nicht brauchen, Eigentum an den code hält, dass eine Kopie, nicht eine Kopie sondern halten einen Zeiger oder Referenz.