2012-03-22 5 views
3

Это нормально:C++ структуры инициализация массива

int vec_1[3] = {1,2,3}; 

так, что случилось с

struct arrays{ 
    int x[3]; 
    int y[3]; 
    int z[3]; 
}; 
arrays vec_2; 
vec_2.x = {1,2,3}; 

, что дает
ошибки: не может преобразовать '< скобки огороженного списка инициализатора >' на 'Int' в задании

Я читал много сообщений об этой ошибке, но до сих пор неясно, где проблема ,

+0

Потому что уже создано. –

+1

Второй недействителен C++. Попробуйте следующее: 'int vec_1 [3];' follow_vec_1 = {1, 2, 3}; 'Это также не будет компилироваться по той же причине. – Chad

ответ

1

В первом примере вы инициализируете вектор, когда вы его объявляете.

Во втором примере, вы intializing дважды (нелегальный), один раз, когда вы объявляете arrays struct, а затем еще раз, когда вы говорите vec_2.x = {1,2,3}

3

Это назначение, не инициализация:

arrays vec_2; 
vec_2.x = {1,2,3}; 

Используйте следующее, что эквивалентно тому, что вы пытаетесь:

arrays vec_2 = { {1, 2, 3 } }; 

Если вы хотите, чтобы указать значения для y и z также:

arrays vec_2 = { {1,2,3}, // x 
       {4,5,6}, // y 
       {7,8,9} // z 
       }; 
5

Первая инициализация. Второй - попытка присвоения, но массивы не могут быть назначены.

Вы могли бы сделать что-то вроде:

arrays vec_2 = {{1,2,3}, {3,4,5}, {4,5,6}}; 

Если вы хотите инициализировать vec_2.x, то вы можете просто оставить остальную часть Инициализаторы:

arrays vec_2 = {1,2,3}; 

В этом случае, остальная часть vec_2 будет инициализирована, чтобы содержать нули.

Хотя вы должны включить хотя бы один набор фигурных скобок вокруг инициализаторов, вам не нужно включать «внутренние», если вы этого не хотите. Включение их может дать вам немного дополнительной гибкости. Например, если вы хотите инициализировать первые два элемента в vec_2.x и первый в vec_2.y, вы можете использовать:

arrays vec_2 = {{1,2}, {3}}; 

В этом случае вы получите vec_2 набор, как если вы» d использовал {1, 2, 0, 3, 0, 0, 0, 0, 0}; в качестве инициализатора.

+0

Я бы ожидал, что C++ 11 разрешит 'x = {1,2,3}', но это не ([expr.ass] 5.17/9). Еще одна причина предпочитать 'std :: array'. Необработанные массивы имеют слишком плохую структуру. – bames53

2
arrays vec_2; 
vec_2.x = {1,2,3}; 

Как сказано в сообщении об ошибке, то вторая строка назначение, не инициализации. Это две разные вещи.

Вы должны сделать это:

arrays vec_2 = { 
     {1,2,3}, //initializes x 
     {5,6,7}, //initializes y 
     {7,8,9}, //initializes z 
}; 

Обратите внимание, что , допускается после последней внутренней фигурной скобки! (я.e {7,8,9}, < - разрешено). Такая конечная запятая обычно полезна для сгенерированного кода: вы можете добавить еще одну строку, не заботясь о запятой, и вам не нужно рассматривать какой-либо специальный случай для последней строки.

2
int vec_1[3] = {1,2,3}; 

Несмотря на то, что он выглядит, это не назначения, это (эффективно) конструктор вызов. Он создает массив из int, инициализированный этими значениями.

arrays vec_2; 

Это создает структуру и каждый из массивов-членов со значениями по умолчанию.

vec_2.x = {1,2,3}; 

Вы не можете назначать массивы, и этот элемент уже сконструирован. Для устранения этой проблемы, как, например:

arrays vec_2 = { {1, 2, 3} }; 

что то же самое, как

arrays vec_2 = { {1, 2, 3}, {0, 0, 0}, {0, 0, 0} }; 
Смежные вопросы