C++ 结构体数组初始化

4

这是可以的:

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};

that gives:

error: cannot convert ‘<brace-enclosed initializer list>’ to ‘int’ in assignment
我已经阅读了很多关于这个错误的帖子,但仍然不清楚问题出在哪里。

因为它已经被创建了。 - Yochai Timmer
1
第二个不是有效的C++代码。请尝试这样写:int vec_1[3]; 然后再加上 vec_1 = {1, 2, 3}; 这样也无法编译通过,原因相同。 - Chad
5个回答

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};作为初始化程序。

我本以为C++11可以允许x={1,2,3},但实际上不行([expr.ass] 5.17/9)。这是更喜欢std::array的另一个原因。原始数组设计太差了。 - bames53

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
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}, <-- 允许)。这种尾随逗号通常对于生成的代码非常有用:您可以添加另一行,而不必考虑逗号,也不需要考虑最后一行的特殊情况。

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} };

1
在第一个例子中,您在声明向量时进行了初始化。
在第二个例子中,您进行了两次初始化(非法),一次是在声明数组结构时,另一次是在vec_2.x = {1,2,3}处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接