【问题标题】:C++ struct array initializationC++结构数组初始化
【发布时间】:2012-03-22 16:41:13
【问题描述】:

没关系:

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

给出:

error: cannot convert ‘<brace-enclosed initializer list>’ to ‘int’ in assignment

我已经阅读了很多关于这个错误的帖子,但仍然不清楚问题出在哪里。

【问题讨论】:

  • 因为它已经被创建了。
  • 第二个不是有效的 C++。试试这个:int vec_1[3]; 后跟 vec_1 = {1, 2, 3}; 这也不会因为同样的原因编译。

标签: c++ arrays struct initialization braces


【解决方案1】:

首先是初始化。第二个是尝试赋值,但是数组是不可赋值的。

你可以这样做:

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 的原因。原始数组的设计太差了。
【解决方案2】:

这是赋值,不是初始化:

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

【讨论】:

    【解决方案3】:
    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} };
    

    【讨论】:

      【解决方案4】:
      arrays vec_2;
      vec_2.x = {1,2,3};
      

      正如错误消息所说,第二行是assignment,而不是initialization。它们是两种不同的东西。

      你需要这样做:

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

      请注意,, 在最后一个内大括号之后是允许的! (即{7,8,9},

      【讨论】:

        【解决方案5】:

        在第一个示例中,您在声明向量时对其进行初始化。

        在第二个示例中,您进行了两次初始化(非法),一次是在您声明 arrays struct 时,另一次是在您说 vec_2.x = {1,2,3}

        【讨论】:

          猜你喜欢
          • 2011-05-09
          • 1970-01-01
          • 2014-02-26
          • 1970-01-01
          • 2010-09-23
          • 2010-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多