C ++ struct array初始化

时间:2012-03-22 16:41:14

标签: c++ arrays struct initialization braces

没关系:

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'

我已经阅读了很多有关此错误的帖子,但目前还不清楚问题出在哪里。

5 个答案:

答案 0 :(得分: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,就像您使用{1, 2, 0, 3, 0, 0, 0, 0, 0};作为初始化程序一样。

答案 1 :(得分:3)

这是赋值,而不是初始化:

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

使用以下内容,这相当于您尝试的内容:

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

如果您还想提供yz的值:

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

答案 2 :(得分: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 
};

请注意,在最后一个内部支撑后允许,! (即{7,8,9},< - 允许)。这样的尾随逗号通常对生成的代码有用:你可以添加另一行,而不用关心逗号,也不需要考虑最后一行的任何特殊情况。

答案 3 :(得分:2)

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

尽管它看起来像,但这不是赋值,这是(有效地)构造函数调用。它构造了一个int数组,初始化为这些值。

arrays vec_2;

这构造了一个struct,并且每个成员数组都有默认值。

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

您无法分配数组,并且此成员已经构建。解决方法是这样的:

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

相同
arrays vec_2 = { {1, 2, 3}, {0, 0, 0}, {0, 0, 0} };

答案 4 :(得分:1)

在第一个例子中,当你声明它时,你正在初始化它。

在第二个示例中,您初始化两次(非法),一次声明arrays struct,然后再说vec_2.x = {1,2,3}