2013-04-14 4 views
1

Я всегда использовал векторы для хранения объектов, когда требуется контейнер типа списка. Я хотел бы знать, как вы можете передать конструкторами массива pointers.The следующие работы в C++ 03, если объект Foo не имеет конструктораПередача конструктора массиву указателей

foo* p = new foo[5]() 

А что, если конструктор foo требуется int как бы Я передаю конструктор в приведенном выше утверждении?

ответ

3

Поскольку C++ 11, вы можете использовать фигурные скобки инициализаторов:

foo * p = new foo[5] { 1, 2, 3, 4, 5 }; // better: "auto p = ..." 

Это предполагает, что foo является неявно построимых из int.

Но вы можете точно также использовать контейнеры:

std::vector<foo> v { 1, 2, 3 }; 
std::list<foo> w { 1, 2, 3 }; 

Или возможно:

std::unique_ptr<foo[]> q(new foo[4] { 1, 2, 3, 4}); 
+0

Мне тоже понадобилось напоминание о неявной конструкции. :) +1 –

3

Невозможно. Ваши экземпляры foo могут быть построены по умолчанию.

UPDATE 1

Если ваш foo не имеет конструктор по умолчанию, то вы получите ошибку компиляции либо об использовании удаленной функции или о не согласующего CTOR.

UPDATE 2

Я вижу, что другие предлагают C++ 11 решение. Мой ответ кажется правильным только для C++ 03 или ранее.

+0

что, если 'Foo' не имеет конструктор по умолчанию? –

1

Как передать конструктор в приведенном выше описании?

new[] не имеет формы для параметров конструктора пересылки.

Вы должны сами называть конструкторы.

foo* p = new foo[5]{ foo(1), foo(2), foo(3), foo(4), foo(5) }; 
+0

'foo * p = new foo [5] {foo (1), foo (2), foo (3), foo (4), foo (5)};' не работает. Он утверждает, что '' конструктор по умолчанию для класса 'foo' не существует –

+0

@ Casper_2211 Я рекомендую отредактировать ваш вопрос, чтобы упомянуть, что вы используете C++ 03, а не C++ 11. –

+0

Я редактировал свой вопрос –

Смежные вопросы