Mit Smartpointer auf ein Array von Objekten zeigen, die keine Default-Konstruktor haben
-
Hallo,
ich habe eine Klasse mit einem Konstruktor, der einen int-Parameter annimmt. Wie kann ich mit einem Unique-Pointer ein Array von Objekten dieser Klasse mit make_unique erzeugen? Mit ist nur die Lösung oben mit einen Array von Smartpointern eingefallen. Aber die Lösung gefält mir nicht. Lieber ein Pointer, der auf mehrere Objekt zeugen kann als mehrere Pointer, die jeweils auf ein Objekt zeigen.#include <memory> #include <iostream> class Foo { private: int i; public: explicit Foo(int i) { this->i=i; } int get() const { return i; } }; int main() { std::unique_ptr<Foo> a[4]; for (auto &p: a) { p=std::make_unique<Foo>(3); std::cout <<p->get()<<std::endl; } }
-
std::vector<foo> a(4);
oder
std::array<foo, 4> a;
@asd1 sagte in Mit Smartpointer auf ein Array von Objekten zeigen, die keine Default-Konstruktor haben:
Lieber ein Pointer, der auf mehrere Objekt zeugen kann
Ein Pointer kann im Prinzip auf beliebig viele verschiedene Objekte zeigen, aber immer nur auf eins gleichzeitig...
-
@Schlangenmensch sagte in Mit Smartpointer auf ein Array von Objekten zeigen, die keine Default-Konstruktor haben:
std::vector<foo> a(4);
Dafür dürfte ein Default-Konstruktor erforderlich sein, eher:
std::vector<Foo> a(4, Foo(3));
-
@Belli Ups, hast recht. So genau hatte ich auf die Beispiel Klasse gar nicht geguckt.
-
@asd1
Wenn deine Objekte kopierbar sind und das Kopieren billig ist, so wie @Belli geschreiben hat. Ansonsten:std::vector<Foo> foos; foos.reserve(4); while (foos.size() < 4) foos.emplace_back(3);
Mit
std::unique_ptr<Foo[]>
ginge das natürlich schon auch, aber komplizierter. Vor allem begibt man sich damit in einen Bereich wo es sehr schwierig ist Code zu schreiben der formal OK ist (also definiertes Verhalten hat bezüglich object lifetime, aliasing etc.).