C ++: динамическое выделение массива элементов с помощью конструктора не по умолчанию - PullRequest
8 голосов
/ 27 мая 2011

Если у меня есть:

struct a_struct
{
    int an_int;

    a_struct(int f) : an_int(f) {}
    a_struct() : an_int(0) {}
};

class a_class
{
    a_struct * my_structs;

    a_class() {...}
};  

Я могу сделать:

a_class() {my_structs = new a_struct(1)}
//or  
a_class() {my_structs = new a_struct [10]}

Но я не могу сделать:

a_class() {my_structs = new a_struct(1) [10]}
//or
a_class() {my_structs = new a_struct() [10]}

Есть ли правильный синтаксис, чтобы заставить это работать? Или легко обойтись?

Ответы [ 4 ]

5 голосов
/ 27 мая 2011

Если использование STL является опцией, вы можете использовать std :: vector вместо динамического массива.

I думаю , что это будет работать:

std::vector<a_struct> my_structs;

my_structs.assign(10, 1);

Если нет, то это должно:

my_structs.assign(10, a_struct(1));
3 голосов
/ 27 мая 2011

Вы можете выделить необработанный кусок памяти и использовать размещение нового для инициализации каждого struct:

int number_of_structs = 10;
my_structs = (a_struct*)new unsigned char[sizeof(a_struct) * number_of_structs];
     // allocate a raw chunk of memory 
a_struct* p = m_structs;
for (int i=0; i<number_of_structs; i++)
{
    new (p) a_struct(i);
    p++;
}

См. Также: Какие варианты использования для "размещения новых"?

0 голосов
/ 27 мая 2011

Вы не можете сделать это напрямую с каким-либо конкретным параметризованным конструктором.Однако вы можете сделать,

a_struct *my_struct[10] = {}; // create an array of pointers

for (int i = 0; i < 10; i++)
    my_struct[i] = new a_struct(i); // allocate using non-default constructor

Когда вы собираетесь отменить выделение памяти,

for (int i = 0; i < 10; i++)
    delete my_struct[i]  // de-allocate memory

Я предлагаю использовать контейнер std::vector вместо того, чтобы проходить этот процесс.

0 голосов
/ 27 мая 2011

Вы можете использовать массив указателей на указатели. Затем вы можете создать массив, который будет содержать указатели на a_struct (), чтобы позже вы могли решить, какой конструктор использовать:

class a_class {
    a_struct ** my_structs;

    a_class() { my_structs = new a_struct* [10]}
    void foo () {
       my_structs[0] = new a_struct(1);
       my_structs[5] = new a_struct("some string and float constructor", 3.14);
    }
}; 
...