2015-02-02 4 views
0

В настоящее время я изучаю C++, и я возился с конструкторами/операторами.Инициализировать объекты динамических массивов с помощью конструктора копии объекта

У меня есть массив:

int x(1); 
int a[] = { int(x), int(x), int(x) }; 

Как я могу построить тот же массив динамически с помощью конструктора копирования объекта? Я также не хочу использовать оператор =.

Так что-то вроде:

int* b; 
for (int i = 0; i < DESIRED_ARRAY_SIZE; i += 1) 
{ 
    b[i](int(x)); 
} 

Конечно выше, не работает. Это строго для учебных целей, поэтому мне интересно, возможно ли это. Мне также интересно, есть ли специальный пример для примитивов против классов, так как я в настоящее время тестирую int atm.

+0

Ни 'int', ни' int [] 'не имеют конструктора копирования. Что вы действительно спрашиваете? –

+0

Это похоже на дубликат http://stackoverflow.com/questions/2409819/c-constructor-initializer-for-arrays. (*) – ALittleDiff

ответ

0

Вы спросили:

Как я могу построить тот же массив динамически с помощью конструктора копирования объекта?

Если у вас есть другой тип, чем int, который имеет конструктор копирования, вы можете использовать:

X x(1); 
X arr[] = {x, x, x, x}; 

Вы сказали:

Я также не хочу использовать оператор = ,

Если у вас есть возможность использовать std::vector, вы можете использовать:

std::vector<X> arr(10, x); 

При использовании std::vector не вариант по какой-то причине, вы можете использовать:

// Create an array objects. The object will be created using 
// the default constructor. 
X* arr = new X[DESIRED_ARRAY_SIZE]; 
for (int i = 0; i < DESIRED_ARRAY_SIZE; i += 1) 
{ 
    arr[i] = x; // This will use the copy assignment operator, 
       // not the copy constructor. 
} 
+0

Я закодировал приведенный выше фрагмент таким образом, чтобы явно обозначать, что я хочу использовать конструктор копирования для каждого из элементов массива. И я хотел бы знать, возможно ли это без использования векторов :). – kir

0

В C++ динамические массивы называются vector и (начиная с C++ 11) вы можете написать:

vector<int> a = { x, x, x }; 

Броски являются избыточными, int(x) - это то же самое, что и x, потому что x - это уже int. (Это не указывает копию).

Инициализатор списков копирует по значению.

В вашем втором примере код:

vector<int> b(DESIRED_ARRAY_SIZE, x); 
+0

Это можно сделать без векторов? Я полностью забыл упомянуть, что в моей проблеме :(О, да, я знаю, что мой код был избыточным. См. Мой комментарий к другому ответу. – kir

+0

«Вектор» - это то, как вы создаете массивы с использованием динамически выделенной памяти на C++; это похоже на вопрос, можете ли вы ввернуть винт, не используя отвертку. Вы можете использовать молоток, но результаты не так хороши ... –

0

= знак привыкает в двух контекстах:

  1. Initialization - Copy, Copy-list или aggregate инициализации
  2. уступке

Когда вы пишете что-то вроде int a[] = {1,2,3}, это агрегатная инициализация.Если вы хотите построить массив динамически, вы должны использовать new[] для динамического выделения вашего массива, а затем для копирования назначьте элементы этого массива. Вы делаете это так:

int* b = new int[DESIRED_ARRAY_SIZE]; 
for (int i = 0; i < DESIRED_ARRAY_SIZE; i += 1) 
{ 
    b[i] = x; 
} 

Существует разница между использованием основных типов, как int и тип класса, скажем T. В приведенном выше фрагменте вы можете заменить int на T (и у x есть тип T), и он будет работать, если T по умолчанию является конструктивным и имеет конструктор копирования. Если нет, есть способы указать, как должны быть построены объекты типа T в b. Вы можете найти информацию в разделе «Строительство» here. Обратите внимание, что в современном C++ есть намного лучшие способы сделать это, но это был не тот вопрос, о котором вы говорили.

0

Как указывалось в других ответах, лучшим выбором было бы использовать std::vector, иначе вы можете использовать new и delete, хотя его не рекомендуется, так как легко совершать ошибки. Всегда помните о delete[], когда вы создали массив с использованием new и delete, если вы только что использовали new, не создавая массив. Рассмотрите другие ответы здесь о std::vector для решения динамических распределений. Если ни один из ответов не является тем, что вы ищете, то, возможно, вам нужно перефразировать свой вопрос.

int* p_array = new int[3]; // '3' would be the array length 
    for (int i{0}; i != 3; ++i)// I'm not naming the arr length in this example. 
     p_array[i] = i; 

    delete[] p_array; 
Смежные вопросы