Как объявить массив объектов класса, если конструктор имеет параметры?

Подскажите, как объявить массив объектов класса, если конструктор класса имеет параметры?

//Прототип констуктора
Individ(int num);

Другой класс:

class Genalg
{
private:
    Individ *generation;
    int size_genom;
    int size_generation;
public:
    dec_generation ()
    {
        generation = new Individ [size_generation];
    }

При компиляции g++ выдаёт что не существует функции Individ без параметов, пытаюсь где то вставить скобку с параметрами наподобие generation = new Individ (size_genom) [size_generation];, компилятор говорит, что после круглых скобок должна быть ";".
Как правильно объявить такой массив?


Ответы (2 шт):

Автор решения: AR Hovsepyan

Вам нужна особая форма оператора new с размещением (placement new). То есть вы размещаете объект по указанному в первой скобке адресу:

//выделим необходимую память    
generation = static_cast<Individ*>(
    operator new [](size_generation * sizeof(Individ)));
//разместим объекты по указателям(на свое место)
for (int i = 0; i < size_generation; ++i)
    //placement new
    new (generation + i)  Individ(0);
//...

Обновил:

да, maestro прав, нужно было еще и написать как освобождать память. Тут нужно учесть, что мы не выделяли память под конкретные объекты, поэтому их деструктор не будет вызван. Деструкторы нужно вызвать в ручную:

 for (int i = 0; i < size_generation; ++i)
     generation[i].~Individ();

А уж потом освобождать все куски, на что указывает generation:

operator delete[](generation);
→ Ссылка
Автор решения: HolyBlackCat

Если бы размер массива был фиксированный, то можно было бы написать new MyClass[N]{...};. Для массива переменного размера это теряет смысл, потому что непонятно, сколько элементов писать в скобках.

Не стоит использовать new и delete, если только вы не пишете свой контейнер или умный указатель. Лучше использовать готовый контейнер - std::vector. Это не только решит проблему с конструктором, но и позволит не думать от ручном освобождении памяти:

std::vector<Individ> generation;

Тогда добавление элемента с с нужными аргументами конструктора выглядит так:

generation.emplace_back(...);

А если нужно много элементов, то так:

generation.assign(N, Individ(...));
→ Ссылка