简体   繁体   English

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

[英]Initializing 2 dimensional array of structs in C++

I am trying to initialize a 2D array of structs in C++, but am getting an error. 我正在尝试在C ++中初始化结构的2D数组,但遇到错误。 Can someone please tell me what am I doing wrong? 有人可以告诉我我在做什么错吗? I have rechecked the braces and they seem to be fine. 我已经重新检查了牙套,它们似乎还不错。

My code: 我的代码:


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

The error I am getting is: 我得到的错误是:

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

When you are trying to use aggregate initializer to initialize an array of objects with used-declared constructor, the syntax you can use depends significantly on how many parameters the individual element's constructor has. 当您尝试使用聚合初始化程序通过使用了声明的构造函数初始化对象数组时,可以使用的语法在很大程度上取决于单个元素的构造函数具有多少个参数。

If the constructor has (read: accepts) only one parameter, you can use "normal" aggregate initializer syntax, as in 如果构造函数仅具有(读取:接受)一个参数,则可以使用“常规”聚合初始化程序语法,如下所示:

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

However, if the constructor you want (or have) to use requires more than one parameter, you cannot pass the constructor arguments as a {} -enclosed list. 但是,如果要使用(或拥有)的构造函数需要多个参数,则不能将构造函数参数作为{}括起来的列表传递。 You have no other choice but to explicitly create temporary objects of the target type in the aggregate initializer, as in 您别无选择,只能在聚合初始化程序中显式创建目标类型的临时对象,如

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

This is exactly what you have to do in your case 这正是您要做的事情

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

and so on. 等等。

Note that in C++ initialization performed by an {} -enclosed initializer list is conceptually a copy-initialization , which means that you are not really changing much by creating those temporaries explicitly. 请注意,在C ++中,由{}包围的初始化器列表执行的初始化从概念上讲是一个复制初始化 ,这意味着通过显式创建这些临时器,您并没有真正改变太多。 Ie conceptually the temporaries are always created during aggregate initialization. 即,从概念上讲,临时项总是在聚合初始化期间创建的。 The compiler will normally optimize them away anyway. 无论如何,编译器通常都会优化它们。

If I understand your intention the problem is that you have given CornerRotationInfo a constructor. 如果我理解您的意图,那么问题是您为CornerRotationInfo了一个构造函数。 This means that it is no longer an aggregate structure and you can't use normal aggregate initialization. 这意味着它不再是聚合结构,并且您不能使用常规的聚合初始化。

If you remove the constructor your brace-enclosed initializer should work. 如果删除构造函数,则用括号括起来的初始化程序应该起作用。

(If, on the other hand, you are trying to use C++0x's initializer_list you should make this clear in your question.) (另一方面,如果您尝试使用C ++ 0x的initializer_list ,则应在问题中明确说明这一点。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM