2010-09-19 9 views
2

J'essaye d'initialiser un tableau 2D de structures en C++, mais j'obtiens une erreur. Quelqu'un peut-il me dire ce que je fais mal? J'ai revérifié les accolades et ils semblent aller bien.Initialisation du tableau bidimensionnel de structures en C++

Mon 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 

L'erreur que je reçois est:

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

C'est une excellente question simple, et la réponse d'AndreyT est parfaite. – Allbite

Répondre

4

Lorsque vous essayez d'utiliser initialiseur global pour initialiser un tableau d'objets Avec le constructeur used-declare, la syntaxe que vous pouvez utiliser dépend significativement du nombre de paramètres du constructeur de l'élément individuel.

Si le constructeur a (lire: accepte) un seul paramètre, (ou ont), vous pouvez utiliser « normale » globale syntaxe initialiseur, comme dans

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

Cependant, si le constructeur que vous souhaitez utiliser nécessite Plus d'un paramètre, vous ne pouvez pas passer les arguments constructeur comme une liste {} -enclosed. Vous avez pas d'autre choix que de créer explicitement des objets temporaires du type cible dans le initialiseur global, comme dans

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

Ceci est exactement ce que vous avez à faire dans votre cas

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

et ainsi de suite .

Notez que dans C++ initialisation effectuée par une {} liste initialiseur -enclosed est conceptuellement une copie-initialisation , ce qui signifie que vous ne changez pas vraiment beaucoup en créant ces explicitement temporaires. C'est à dire. conceptuellement, les provisoires sont toujours créés au cours de l'initialisation globale. Normalement, le compilateur les optimisera de toute façon.

+0

Droit sur l'argent. – Allbite

+0

Merci AndreyT et tous les autres. –

1

Si je comprends votre intention le problème est que vous avez donné CornerRotationInfo un constructeur. Cela signifie qu'il ne s'agit plus d'une structure agrégée et que vous ne pouvez pas utiliser l'initialisation d'agrégat normale.

Si vous supprimez le constructeur, votre initialiseur accolade doit fonctionner.

(Si, d'autre part, vous essayez d'utiliser C++ 0x vous de initializer_list devrait le préciser dans votre question.)