在C ++中初始化结构的二维数组

时间:2010-09-19 18:40:33

标签: c++ initialization multidimensional-array

我正在尝试在C ++中初始化一个二维结构数组,但是收到错误。有人可以告诉我,我做错了什么?我已经重新检查了牙箍,它们看起来很好。

我的代码:


struct CornerRotationInfo {
  bool does_breed;
  int breed_slope;
  bool self_inversion;
  int self_slope;
  inline CornerRotationInfo(bool db, int bs, bool si, int ss) : does_breed(db), breed_slope(bs), self_inversion(si), self_slope(ss) {};
};

#define NO false
#define YES true
#define R 1
#define F -1
#define H 0
static const CornerRotationInfo corner_rot_info[3][8] = {
  // { 0, 45, 90, 135
  //  180, 225, 270, 315 }
  {
    { NO, F, NO, F }, {YES, F, NO, H }, {YES, H, NO, R}, {NO, R, YES, R },
    { NO, F, NO, F }, {YES, F, NO, H }, {YES, H, NO, R}, {NO, R, YES, R }
  }, // Falling
  {
    { NO, H, NO, H }, {YES, F, NO, R }, {NO, H, YES, H }, {YES, R, NO, F },
    { NO, H, NO, H }, {YES, F, NO, R }, {NO, H, YES, H }, {YES, R, NO, F }
  }, // Horizontal
  {
    { NO, R, NO, R }, {NO, F, YES, F }, {YES, H, NO, F}, {YES, R, NO, H },
    { NO, R, NO, R }, {NO, F, YES, F }, {YES, H, NO, F}, {YES, R, NO, H }
  }  // Rising
};

#undef NO
#undef YES
#undef R
#undef F
#undef H

我得到的错误是:

Transformation.C:72: error: brace-enclosed initializer used to initialize `const
 CornerRotationInfo'

2 个答案:

答案 0 :(得分:4)

当您尝试使用聚合初始值设定项初始化具有使用声明的构造函数的对象数组时,您可以使用的语法在很大程度上取决于单个元素的构造函数具有多少参数。

如果构造函数只有(读取:接受)一个参数,则可以使用“普通”聚合初始值设定语法,如

std::string a[2] = { "abc", "def" };

但是,如果您想要(或有)使用的构造函数需要多个参数,则不能将构造函数参数作为{}附带的列表传递。除了在聚合初始值设定项中显式创建目标类型的临时对象之外别无选择,如

std::vector v[2] = { std::vector(10, 3), std::vector(8, 2) };

这正是你需要做的事情

static const CornerRotationInfo corner_rot_info[3][8] = {
  {
    CornerRotationInfo(NO, F, NO, F), 
    CornerRotationInfo(YES, F, NO, H),
    ...
  },
  ...
};

等等。

请注意,在{}执行的C ++初始化中 - 封闭的初始化列表在概念上是复制初始化,这意味着通过显式创建这些临时值,您实际上并没有太大的改变。即从概念上讲,临时数总是在聚合初始化期间创建的。无论如何,编译器通常会优化它们。

答案 1 :(得分:1)

如果我理解你的意图问题是你给了CornerRotationInfo一个构造函数。这意味着它不再是聚合结构,您不能使用正常的聚合初始化。

如果你删除了构造函数,你的大括号括起初始化器应该可以工作。

(另一方面,如果你试图使用C ++ 0x initializer_list,你应该在你的问题中明确这一点。)