Выделение памяти и конструкторы параметрами
От: shumer  
Дата: 04.02.03 12:24
Оценка:
Подскажите пожалуйста. Есть класс. Создаем объекты:
class_name* pclass_name = new class_name[10];
Получаем 10 объектов и массив указателей на них. Но как быть,
если конструктор с параметром?
class_name* pclass_name = new class_name(5)[10];
Так не работает. В имеющейся литературе пока ничего не нашел.
Re: Выделение памяти и конструкторы параметрами
От: VCoder http://wxbar.sf.net
Дата: 04.02.03 12:28
Оценка:
Здравствуйте, shumer, Вы писали:

S>Получаем 10 объектов и массив указателей на них. Но как быть,

S>если конструктор с параметром?
S>class_name* pclass_name = new class_name(5)[10];
S>Так не работает. В имеющейся литературе пока ничего не нашел.

К сожалению, никак.
Для того чтобы иметь возможность создавать массивы объектов необходим конструктор БЕЗ параметров.
С уважением,
Дмитрий.
Re: Выделение памяти и конструкторы параметрами
От: Amor Россия  
Дата: 04.02.03 12:32
Оценка:
Здравствуйте, 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

Не существует способа явного указания аргументов конструктора (...) при объявлении массива....


Кроме таких вещей как например:

std::string mass[] = {"first", "second", "third"};

вот.
Re[2]: Выделение памяти и конструкторы параметрами
От: shumer  
Дата: 04.02.03 12:41
Оценка:
Спасибо всем за такой стремительный ответ. Придется придумать что-то другое.
Re[3]: Выделение памяти и конструкторы параметрами
От: Amor Россия  
Дата: 04.02.03 12:52
Оценка:
Здравствуйте, 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]: Выделение памяти и конструкторы параметрами
От: Lorenzo_LAMAS  
Дата: 04.02.03 13:00
Оценка:
A>class clname
A>{
A>   TYPE m_member;
A>public:
A>   static TYPE init_val;
A>   clname(){m_member=init_val;}
A>   clname(TYPE val):m_member(val);
A>};
A>


A>как вариант...

Ну уж тогда лучше clname():m_member(init_val){}
Of course, the code must be complete enough to compile and link.
Re[3]: Выделение памяти и конструкторы параметрами
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.02.03 13:12
Оценка:
Здравствуйте, shumer, Вы писали:

Похоже на танцы с бубном, но можно так:
struct MyClass
{
    MyClass(int x, const char *s);
};

std::vector<MyClass> v(10, MyClass(3, "test"));
... << RSDN@Home 1.0 beta 5 >>
Re: Выделение памяти и конструкторы параметрами
От: Alik Украина  
Дата: 04.02.03 14:22
Оценка:
Здравствуйте, 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>Так не работает. В имеющейся литературе пока ничего не нашел.

Решение в лоб: создай массив указателей, а потом проинициализируй каждый элемент массива.
У способа есть ряд недостатков (неудобств), но работать будет
С уважением. Алик.
Re: Выделение памяти и конструкторы параметрами
От: Stanislav Kondratiev  
Дата: 05.02.03 07:23
Оценка:
Здравствуйте, 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);
Re: Выделение памяти и конструкторы параметрами
От: dupamid Россия  
Дата: 05.02.03 07:35
Оценка:
Здравствуйте, 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;
}
Re: Выделение памяти и конструкторы параметрами
От: Phazz Россия  
Дата: 06.02.03 08:29
Оценка:
Здравствуйте, shumer, Вы писали:

Посмотрите в книге "Язык программирования С++. Вводный курс." Липпман С., Лажойе Ж
там есть мысли по этому поводу.
... << RSDN@Home 1.0 beta 5 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.