Ich habe ein C++ - Objekt vom Typ ObjectArray
typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray;
Wie lautet die Syntax, um einen unique_ptr
für ein neues Objekt vom Typ Class1
zu erstellen und in ein Objekt vom Typ ObjectArray
einzufügen?
Als erste Bemerkung würde ich es nicht ObjectArray
nennen, wenn es sich um eine Karte und nicht um ein Array handelt.
Auf jeden Fall können Sie Objekte auf diese Weise einfügen:
ObjectArray myMap;
myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1())));
Oder so:
ObjectArray myMap;
myMap[0] = std::unique_ptr<Class1>(new Class1());
Der Unterschied zwischen den beiden Formularen besteht darin, dass die erstere fehlschlägt, wenn der Schlüssel 0
bereits in der Karte vorhanden ist, während die zweite Form ihren Wert mit der neuen überschreibt.
In C++ 14 möchten Sie möglicherweise std::make_unique()
verwenden, anstatt den unique_ptr
aus einem new
-Ausdruck zu konstruieren. Zum Beispiel:
myMap[0] = std::make_unique<Class1>();
Wenn Sie einen vorhandenen Zeiger hinzufügen möchten, der in die Map eingefügt werden soll, müssen Sie std :: move verwenden.
Zum Beispiel:
std::unique_ptr<Class1> classPtr(new Class1);
myMap.insert(std::make_pair(0,std::move(classPtr)));
Zusätzlich zu den vorherigen Antworten wollte ich darauf hinweisen, dass es auch eine Methode emplace
gibt (dies ist praktisch, wenn Sie keine Kopie erstellen können/wollen). Sie können sie also folgendermaßen schreiben:
ObjectArray object_array;
auto pointer = std::make_unique<Class1>(...); // since C++14
object_array.emplace(239LL, std::move(pointer));
// You can also inline unique pointer:
object_array.emplace(30LL, std::make_unique<Class1>(...));