Как объявить массив объектов класса, если конструктор имеет параметры?
Подскажите, как объявить массив объектов класса, если конструктор класса имеет параметры?
//Прототип констуктора
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 шт):
Вам нужна особая форма оператора 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);
Если бы размер массива был фиксированный, то можно было бы написать new MyClass[N]{...};. Для массива переменного размера это теряет смысл, потому что непонятно, сколько элементов писать в скобках.
Не стоит использовать new и delete, если только вы не пишете свой контейнер или умный указатель. Лучше использовать готовый контейнер - std::vector. Это не только решит проблему с конструктором, но и позволит не думать от ручном освобождении памяти:
std::vector<Individ> generation;
Тогда добавление элемента с с нужными аргументами конструктора выглядит так:
generation.emplace_back(...);
А если нужно много элементов, то так:
generation.assign(N, Individ(...));