В этой статье размещена выжимка по вопросу о том, как создать массив объектов, у которых конструктор имеет аргументы. Ответ я искал очень долго, так как оказалось, что стандартных механизмов для создания массивов объектов с аргументами в C++ нет.
Вопрос
Есть объект, у которого конструктор имеет аргументы. Нужно создать массив таких объектов, скормив конструкторам одинаковые аргументы. Но вот не пойму, какой синтаксис надо использовать.
Массив объектов с конструктором без аргументов создать довольно просто:
element elements[100];
А как сделать массив объектов с конструктором, у которого есть аргументы?
Ответ
Чтобы такое сделать, надо вручную создать массив объектов. Для этого вначале выделяется память под массив объектов, а потом в этой памяти надо создать нужное количество объектов с нужными параметрами конструктора. В момент создания объектов можно задавать одинаковые параметры конструкторам, а можно и разные, например, по какому-нибудь алгоритму.
Пример:
// Ручное создание массива объектов в C++
// Выделяется память для объектов класса Foo в количестве count
Foo *foos = (Foo*)operator new( sizeof( Foo ) * count ) );
// Создаются элементы массива (объекты) с нужными начальными аргументами
for(int i=0; i<count; ++i )
new( &foos[ i ] ) Foo( a, b );
...
// Удаление элементов
for( int i = 0; i < count; ++i )
foos[ i ].~Foo();
// И удаление начального указателя
operator delete( foos );
В этом примере продемонстрированы основные действия по созданию массива объектов с аргументами в конструкторе - от создания массива до удаления.