Dynamic array of objects - initialization
Hello everyone,
I want to create an array of objects at run-time.
AFAIU, operator new[] will call the default constructor for each object
in the array. In other words, the following program will print INSIDE
DEFAULT CTOR five times.
#include <vector>
#include <cstdio>
struct Foo
{
Foo(int u) {
puts("INSIDE CTOR"); p = new char[u];
}
Foo() {
puts("INSIDE DEFAULT CTOR"); p = new char[666];
}
~Foo() {
puts("INSIDE DTOR"); delete[] p;
}
char *p;
};
int main()
{
Foo *ww = new Foo[5];
return 0;
}
$ g++ -Wall -g3 vectest.cxx
vectest.cxx: In function `int main()':
vectest.cxx:20: warning: unused variable 'ww'
$ ./a.out
INSIDE DEFAULT CTOR
INSIDE DEFAULT CTOR
INSIDE DEFAULT CTOR
INSIDE DEFAULT CTOR
INSIDE DEFAULT CTOR
What if I want to use a different constructor?
For example, how can I get the program to create an array of 5 objects
that hold a 123-byte buffer?
Foo *ww = new Foo(123)[5];
is a syntax error. Am I missing something obvious?
I suppose I could add a static variable to class Foo and have the
default constructor use the value of that variable...
struct Foo
{
Foo(int u) {
puts("INSIDE CTOR"); p = new char[u];
}
Foo() {
puts("INSIDE DEFAULT CTOR"); p = new char[666];
}
~Foo() {
puts("INSIDE DTOR"); delete[] p;
}
char *p;
static int defaultsize;
};
int Foo::defaultsize = 0;
int main()
{
Foo::defaultsize = 123;
Foo *ww = new Foo[5];
return 0;
}
But that feels like a kludge. Is there a better solution?
On a related note, would a vector help in this situation?
I could write something along the lines of
std::vector < Foo > v;
v.reserve(N);
for (int i=0; i < N; ++i)
{
Foo *curr = new Foo(size)
v.push_back(*curr);
}
But that feels somewhat like a kludge too.
Regards.