Allerdings bestreite ich auch nicht, dass C++ eindeutig eine Möglichkeit fehlt Objekte ohne Standard-Konstruktor als Array anzulegen.
Das stimmt zwar, mit placement new lässt sich das gewünschte Ergebnis aber zumindest theoretisch erreichen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <memory>
class Blub
{
public:
Blub(int i) {}
Blub(const Blub&) = delete;
Blub& operator =(const Blub&) = delete;
};
int main()
{
static const size_t N = 1000;
auto my_array_buffer = std::make_unique<alignas(Blub) char[]>(N);
Blub* my_array = reinterpret_cast<Blub*>(&my_array_buffer[0]);
// Objekte konstruieren
for (Blub* p = my_array; p < my_array + N; ++p)
new (p) Blub(42);
// ...
// Destructor muss manuell aufgerufen werden! :(
for (Blub* p = my_array + N; p != my_array;)
(--p)->~Blub();
}
|
Wobei ich mir natürlich sehr gut überlegen würde, ob
std::vector mit
emplace_back() nicht die bessere Idee ist. Wenn, sollte man das Ganze auf jeden Fall in einer entsprechenden Klasse kapseln...