【问题标题】:Initializing 2 dimensional array of structs in C++在 C++ 中初始化结构的二维数组
【发布时间】:2011-04-14 09:39:15
【问题描述】:

我正在尝试在 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:错误:大括号括起来的初始化程序用于初始化`const 角旋转信息'

【问题讨论】:

  • 这是一个非常直接的问题,AndreyT 的回答很完美。

标签: c++ initialization multidimensional-array


【解决方案1】:

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

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

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

但是,如果您希望(或必须)使用的构造函数需要多个参数,则不能将构造函数参数作为{}-enclosed 列表传递。您别无选择,只能在聚合初始化器中显式创建目标类型的临时对象,如

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++ 中,由 {}-enclosed 初始化列表执行的初始化在概念上是一个复制初始化,这意味着通过显式创建这些临时变量并不会真正改变太多。 IE。从概念上讲,临时对象总是在聚合初始化期间创建。无论如何,编译器通常会优化它们。

【讨论】:

  • 感谢 AndreyT 和所有其他人。
【解决方案2】:

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

如果您删除构造函数,您的大括号括起来的初始化程序应该可以工作。

(另一方面,如果您尝试使用 C++0x 的 initializer_list,您应该在问题中明确说明。)

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 2021-02-03
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2017-01-19
    • 2021-10-02
    相关资源
    最近更新 更多