2011-01-10 6 views
1

Вы можете написать так:C++ выделить синтаксический массив вопрос

int test[] = {1,2,3,4}; 

но что, если вы хотите использовать указатель и передать его с новым?

int *test2; 
test2 = new int[]{1,2,3,4}; 

Это не работает, какой синтаксис или это возможно?

+0

Возможный дубликат [Inline array initialization] (http://stackoverflow.com/questions/4583628/inline-array-initialization) –

ответ

3

Это одно из коротких номеров нынешнего стандарта C++. Инициализация не форма. Ваша лучшая надежда is uniform initialization in C++0x, но для среднего значения, когда вы можете назначить значения после создания массива, например.

int *test2; 
test2 = new int[4]; // Note that you still have to specify the size in C++0x 
test2[0] = 1; 
test2[1] = 2; 
test2[2] = 3; 
test2[3] = 4; 
+2

Существует также Boost.Assign, если вы готовы поиграть с этим. – jalf

+0

@jalf Да, я использовал его и любил, но в эти дни я использую g ++ 4.6, а поддержка C++ 0x прекрасна :) – AraK

3

Если компилятор supports C++0x

int *test2; 
test2 = new int[4] {1,2,3,4}; // Initializer list in C++0x 

будет работать. Однако вы всегда должны использовать std::vector вместо массивов стилей C при написании хорошего кода на C++.

+0

Если вам не нужен динамический массив, вы не должны его использовать. Если статический массив подходит, добавление сложности к проблеме не делает его «хорошим кодом C++». Будь проще. – Simon

+0

@Simon: Я просто предлагал возможное решение проблемы. Ничего особенного! –

+0

Sauray: нет, вы не просто предложили решение. Это было ваше первое предложение. Ваше второе предложение предложило совет, с которым мы с Симоном не согласны. Но +1 для вашего первого предложения :-) – TonyK

2

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

Возможно, вы захотите изучить библиотеку boost :: assign, которая может поддерживать этот тип инициализации (не уверен). В качестве альтернативы вы можете (за счет большего количества кода) сделать это самостоятельно для типов POD:

int * array = new int[4]; 
{ 
    int values[] = { 1,2,3,4 }; 
    memcpy(array, values, sizeof(values)); 
} 

Или не-стручка типов:

type * array = new type[4]; 
{ 
    type values[] = { 1,2,3,4 }; // assuming type(int) constructor 
    std::copy(values, values+4, array); // better to use some magic to calculate size 
} 

Во всяком случае, оба эти решения требуют выделяя на местном уровне и копирование (бит-размер/C++) в динамически выделенную память.

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