2010-06-10 6 views
0
class A 
{ 
private: 
int m_nValue; 
public: 
A() 
{ 
m_nValue = 0; 
} 
A(int nValue) 
{ 
m_nValue = nValue); 
~A() 
{} 
} 

Теперь в основной, если я называюДинамическое распределение памяти со значениями по умолчанию

A a(2);// 2 will be assigned for m_nValue of object A. 

Теперь, как мы делаем это, если я хочу, чтобы определить массив объектов. Кроме того, как мы делаем это, если я динамически создавать объекты с помощью оператора нового как

A *pA; 
pA = new A[5];// while creating the object i want the parameterised constructor to be 

//called 

Я надеюсь, что вопрос ясен. Дайте мне знать, если требуется дополнительное объяснение.

+0

Подробнее "любопытство"? Или еще не готов читать учебник C++? –

+0

Просто «любопытство». – ckv

+2

Итак, какой учебник C++ вы используете, в котором эта проблема не рассматривается? –

ответ

5

Вы не можете этого сделать.

Если вы хотите динамически выделять массив, он должен быть конструктивным объектом по умолчанию. Это означает, что у него должен быть конструктор без параметров, который будет использоваться.

+0

Неверно. Это справедливо для массивов, выделенных новыми выражениями, но не для массивов вообще. Массив нестандартных по умолчанию объектов можно легко объявить с помощью агрегатного инициализатора. – AnT

1

Обычно вы не можете это сделать, поскольку объекты массива по умолчанию сконструированы, но один быстрый взлом - вы можете создать подкласс, конструктор по умолчанию которого передается параметрам (-ам), которые вы хотите использовать для базового класса.

template<int I> 
class B : public A 
{ 
public: 
    B() : A(I) { } 
}; 
... 

A *pA; 
pA = new B<42>[5]; 

Нарушение наследования таким образом, в некоторых кругах, нахмурилось.

2

, если я хочу, чтобы определить массив объектов

Это C++, вы не хотите массивы ;-)

std::vector<A> v(5, A(2)); 
+0

+1 для предлагаемого вектора – Default

1

Если вы хотите, чтобы определить массив, вы может использовать агрегатный инициализатор

A a[5] = { 1, 2, 3, 4, 5 }; 

Обратите внимание, что эта инициализация совокупности следует за копией-инициализацией Тион семантика, поэтому для каждого элемента будет эквивалентно

A a1 = 1; 

не оригинал

A a1(1); 

Что касается новой экспрессии ... Только инициализатора вы можете поставить в массиве новый- выражение - пустой инициализатор (), который инициирует инициализацию значения. Язык в это время не поддерживается никакими другими инициализаторами.

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