Ik heb een C++-object van het type ObjectArray
typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray;
Wat is de syntaxis om een unique_ptr
te maken voor een nieuw object van het type Class1
en dit in te voegen in een object van het type ObjectArray
?
Antwoord 1, autoriteit 100%
Als eerste opmerking zou ik het geen ObjectArray
noemen als het een kaart is en geen array.
Hoe dan ook, je kunt objecten op deze manier invoegen:
ObjectArray myMap;
myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1())));
Of op deze manier:
ObjectArray myMap;
myMap[0] = std::unique_ptr<Class1>(new Class1());
Het verschil tussen de twee vormen is dat de eerste zal mislukken als de sleutel 0
al aanwezig is op de kaart, terwijl de tweede zijn waarde zal overschrijven met de nieuwe.
In C++14 wil je misschien std::make_unique()
in plaats van de unique_ptr
te construeren uit een new
expressie. Bijvoorbeeld:
myMap[0] = std::make_unique<Class1>();
Antwoord 2, autoriteit 77%
Als je een bestaande aanwijzer wilt toevoegen om in de kaart in te voegen, moet je std::move gebruiken.
Bijvoorbeeld:
std::unique_ptr<Class1> classPtr(new Class1);
myMap.insert(std::make_pair(0,std::move(classPtr)));
Antwoord 3, autoriteit 6%
Naast eerdere antwoorden wil ik je erop wijzen dat er ook een methode is emplace
(handig als je geen kopie kunt/wil maken), zodat je die kunt schrijven zoals dit:
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>(...));