Конструкторы в массиве
От: Аноним  
Дата: 26.04.12 18:20
Оценка:
Почему в C++ запрещено использование любых конструкторов, кроме конструктора по умолчанию, в случае создания массива объектов?
Re: Конструкторы в массиве
От: Кодт Россия  
Дата: 26.04.12 18:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему в C++ запрещено использование любых конструкторов, кроме конструктора по умолчанию, в случае создания массива объектов?


Почему же запрещено?
struct foo
{
  foo(const char* = "test", int = 123) {} // конструктор, используемый в роли конструктора по умолчанию
  foo(int) {} // конструктор для приведения типа
  foo(int,int,int) {}
};

foo a[10] = { foo(), 123, "qqq", foo(1,2,3), /* остальные элементы будут сконструированы по умолчанию - foo("test",123) */ };
foo *b = new foo[10]; // все элементы будут сконструированы по умолчанию - foo("test",123)
Перекуём баги на фичи!
Re: Конструкторы в массиве
От: Char_Int  
Дата: 26.04.12 18:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему в C++ запрещено использование любых конструкторов, кроме конструктора по умолчанию, в случае создания массива объектов?


не запрещено



// определяет массив из 16 объектов Account. Каждый элемент по очереди инициализируется конструктором по умолчанию. 
Account table[ 16 ];

// Можно явно передать конструкторам аргументы внутри заключенного в фигурные скобки списка инициализации массива
Account pooh_pals[] = { "Piglet", "Eeyore", "Tigger" };
Re[2]: Конструкторы в массиве
От: YourLastSong  
Дата: 26.04.12 19:02
Оценка:
Я имею ввиду что-то наподобие такого:

MyClass A[size](first, second);


или

MyClass* A = new MyClass[size](first, second);


Какие-то проблемы реализации?
Re[3]: Конструкторы в массиве
От: Erop Россия  
Дата: 26.04.12 22:24
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>
YLS>MyClass A[size](first, second);
YLS>


YLS>или


YLS>
YLS>MyClass* A = new MyClass[size](first, second);
YLS>


YLS>Какие-то проблемы реализации?


Никаких, только зачем это всё при живом векторе-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Конструкторы в массиве
От: Кодт Россия  
Дата: 27.04.12 20:29
Оценка:
Здравствуйте, Erop, Вы писали:

YLS>>Какие-то проблемы реализации?

E>Никаких, только зачем это всё при живом векторе-то?

Единственная проблема — если класс не assignable и/или не copy constructible.
Тогда живым вектором не отделаешься.
Придётся городить собственный огород "по мотивам". Упрощённо,
MyClass* array = (MyClass*) new aligned_storage<MyClass>[count]; // (MyClass*) malloc(sizeof(T)*count);
for_each(array, array+count, [](MyClass& object) { new(&object) MyClass(first,second); } );

.....

for_each(array, array+count, [](MyClass& object) { object.~MyClass(); } );
delete[] (aligned_storage<T>*)array; // free(array);

С другой стороны, для крупных объектов (которые некопируемы по причине своих размеров, в том числе), можно припахать ptr_vector.
А для мелких — пересмотреть в сторону копируемости, либо двухфазной инициализации. (Первая фаза — в конструкторе, вторая — ручной вызов функции).
Перекуём баги на фичи!
Re[2]: Конструкторы в массиве
От: DogBone  
Дата: 28.04.12 06:49
Оценка:
Здравствуйте, Char_Int, Вы писали:

C_I>Здравствуйте, Аноним, Вы писали:


А>>Почему в C++ запрещено использование любых конструкторов, кроме конструктора по умолчанию, в случае создания массива объектов?


C_I>не запрещено



C_I>

C_I>// определяет массив из 16 объектов Account. Каждый элемент по очереди инициализируется конструктором по умолчанию. 
C_I>Account table[ 16 ];

C_I>// Можно явно передать конструкторам аргументы внутри заключенного в фигурные скобки списка инициализации массива
C_I>Account pooh_pals[] = { "Piglet", "Eeyore", "Tigger" };

C_I>


Добавлю что в списке инициализации конструкторы могут вызываться разные
Account pooh_pals[] = { "Piglet", 1, {"Tiger", "Wood"} };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.