Подскажите пожалуйста. Есть класс. Создаем объекты:
class_name* pclass_name = new class_name[10];
Получаем 10 объектов и массив указателей на них. Но как быть,
если конструктор с параметром?
class_name* pclass_name = new class_name(5)[10];
Так не работает. В имеющейся литературе пока ничего не нашел.
Здравствуйте, shumer, Вы писали:
S>Получаем 10 объектов и массив указателей на них. Но как быть, S>если конструктор с параметром? S>class_name* pclass_name = new class_name(5)[10]; S>Так не работает. В имеющейся литературе пока ничего не нашел.
К сожалению, никак.
Для того чтобы иметь возможность создавать массивы объектов необходим конструктор БЕЗ параметров.
Здравствуйте, shumer, Вы писали:
S>Подскажите пожалуйста. Есть класс. Создаем объекты: S>class_name* pclass_name = new class_name[10]; S>Получаем 10 объектов и массив указателей на них. Но как быть, S>если конструктор с параметром? S>class_name* pclass_name = new class_name(5)[10]; S>Так не работает. В имеющейся литературе пока ничего не нашел.
У Страуструпа 10.4.7
Не существует способа явного указания аргументов конструктора (...) при объявлении массива....
Здравствуйте, shumer, Вы писали:
S>Спасибо всем за такой стремительный ответ. Придется придумать что-то другое.
Могу предложить первое что на ум пришло:
class clname
{
TYPE m_member;
public:
static TYPE init_val;
clname(){m_member=init_val;}
clname(TYPE val):m_member(val);
};
clname::init_val=something;
clname * p = new clname[10];
как вариант...
Re[4]: Выделение памяти и конструкторы параметрами
Здравствуйте, shumer, Вы писали:
S>Подскажите пожалуйста. Есть класс. Создаем объекты: S>class_name* pclass_name = new class_name[10]; S>Получаем 10 объектов и массив указателей на них. Но как быть, S>если конструктор с параметром? S>class_name* pclass_name = new class_name(5)[10]; S>Так не работает. В имеющейся литературе пока ничего не нашел.
Решение в лоб: создай массив указателей, а потом проинициализируй каждый элемент массива.
У способа есть ряд недостатков (неудобств), но работать будет
Здравствуйте, shumer, Вы писали:
S>Подскажите пожалуйста. Есть класс. Создаем объекты: S>class_name* pclass_name = new class_name[10]; S>Получаем 10 объектов и массив указателей на них. Но как быть, S>если конструктор с параметром? S>class_name* pclass_name = new class_name(5)[10]; S>Так не работает. В имеющейся литературе пока ничего не нашел.
Один из вариантов:
Class* p = ::operator new (sizeof(Class) * 10);
for (size_t i = 0; i < 10; ++i)
new (p+i) Class(parameters);
Здравствуйте, shumer, Вы писали:
S>Подскажите пожалуйста. Есть класс. Создаем объекты: S>class_name* pclass_name = new class_name[10]; S>Получаем 10 объектов и массив указателей на них. Но как быть, S>если конструктор с параметром? S>class_name* pclass_name = new class_name(5)[10]; S>Так не работает. В имеющейся литературе пока ничего не нашел.
Можно воспользоваться редко используемыми функиями из заголовка <memory>: uninitialized_fill, uninitialized_fill_n и uninitialized_copy, последний самый мощный с ним можно обойти ограничения на один параметр. Например:
#include <iostream>
#include <memory>
using namespace std;
struct S
{
S(int i) : i(i)
{
}
int i;
};
int main()
{
S* p = (S*)operator new(10 * sizeof(S)); // new S[10] - не получится нет конструктора по умолчанию
uninitialized_fill_n(p, 10, 1);
for(int i = 0; i < 10; i++)
cout << p[i].i << endl;
}