2009-03-10 15 views
9

J'ai créé deux structures différentes dans un programme. J'ai maintenant une structure avec des structures imbriquées mais je ne peux pas trouver comment les initialiser correctement. Les structures sont énumérées ci-dessous. Je tente ensuite d'initialiser un nouveau joueur appelé struct struct.Comment initialiser des structures imbriquées en C++?

//Creates player, usings vectors copy and iterator constructors 
Player player = { 
vector<float>(xcords,xcords + (sizeof(xcords)/sizeof(float))), //xcords of player 
vector<float>(ycords,ycords + (sizeof(ycords)/sizeof(float))), //ycoords of playe 
box.ymax = 5;    //create bounding box 
box.ymin = 1; 
box.xmax = 5; 
box.xmin = 1; 
1,1,1,      //red, green, blue 
0.0f,0.0f,     //r_leg,l_leg 
{4,4,4},     //number points per polygon 
true,false};    //up, down 

Cela provoque plusieurs erreurs différentes, concernant la boîte. L'affichage de la boîte n'a pas d'identificateur clair et de struct ou syntaxe manquante avant '.'.

J'ai ensuite essayé simplement de créer une struct du joueur et initialisez ses membres comme suit:

Player bob; 
bob.r_leg = 1; 

Mais cela provoque plus d'erreurs, comme le compilateur pense bob n'a aucun identifiant ou manquant une syntaxe.

Je ai googlé le problème, mais je n'ai trouvé aucun article me montrant comment initaliser de nombreux membres différents des structures imbriquées dans la structure (parent). Toute aide sur ce sujet serait grandement appréciée :-) !!!

+0

Je réalise cet extrait a déjà des problèmes que les magasins de boîte englobantes points ainsi besoin ymax.x et ymax.y besoin initalising . Cependant j'ai essayé mais j'ai eu les mêmes erreurs. (c'est-à-dire que j'ai fait ymax.y = 5; ymax.x = 1; etc etc.) – binarycreations

+0

veuillez joindre les erreurs. –

+0

Vous devez les initialiser dans les constructeurs de toute façon. Vous ne voulez pas de valeurs indéfinies. –

Répondre

19

INITIALISATION normalement avec { ... }:

Player player = { 
    vector<float>(xcords,xcords + (sizeof(xcords)/sizeof(float))), 
    vector<float>(ycords,ycords + (sizeof(ycords)/sizeof(float))), 
    5, 1, 5, 1, 5, 1, 5, 1, 
    1.0f,1.0f,1.0f,       //red, green, blue 
    0.0f,0.0f,        //r_leg,l_leg 
    {4,4,4},        //number points per polygon 
    true,false 
}; 

Maintenant, qui est utilise "accolade élision". Certains compilateurs mettent en garde contre cela, même si c'est complètement standard, car cela pourrait dérouter les lecteurs. Mieux vous ajoutez des accolades, donc il est clair ce qui est initialisé où:

Player player = { 
    vector<float>(xcords,xcords + (sizeof(xcords)/sizeof(float))), 
    vector<float>(ycords,ycords + (sizeof(ycords)/sizeof(float))), 
    { { 5, 1 }, { 5, 1 }, { 5, 1 }, { 5, 1 } }, 
    1.0f, 1.0f, 1.0f,    //red, green, blue 
    0.0f, 0.0f,      //r_leg,l_leg 
    { 4, 4, 4 },     //number points per polygon 
    true, false 
}; 

Si vous voulez seulement initialiser le membre x des points, vous pouvez le faire en supprimant l'autre initialiseur. Les éléments restants dans les agrégats (tableaux, structures) seront initialisés aux valeurs «correctes». Par exemple, un NULL pour les pointeurs, un false pour bool, zéro pour ints et ainsi de suite, et en utilisant le constructeur pour les types définis par l'utilisateur. La ligne initialisant les points ressemble à ceci, puis

{ { 5 }, { 5 }, { 5 }, { 5 } }, 

Maintenant vous pouvez voir le danger d'utiliser l'élision de l'orthèse. Si vous ajoutez un membre à votre structure, tous les initialiseurs sont "décalés" par rapport à leurs éléments réels qu'ils doivent initialiser, et ils pourraient accidentellement toucher d'autres éléments. Donc, mieux vaut toujours utiliser des accolades, le cas échéant.

Pensez cependant à utiliser des constructeurs.Je viens de terminer votre code en montrant comment vous le feriez en utilisant des initialiseurs.

4

Vous pouvez ajouter des valeurs par défaut à une structure comme ceci:

struct Point{ 
    Point() : x(0), y(0) 
    { }; 

    float x; 
    float y; 
}; 

ou

struct Point{ 
    Point() 
    { 
     x = 0; 
     y = 0; 
    }; 

    float x; 
    float y; 
}; 

Pour ajouter ces valeurs lors de la construction, ajouter des paramètres aux constructeurs comme ceci:

struct Point{ 
    Point(float x, float y) 
    { 
     this->x = x; 
     this->y = y; 
    }; 

    float x; 
    float y; 
}; 

et instanciez-les avec:

Point Pos(10, 10); 
Point *Pos = new Point(10, 10); 

Cela fonctionne également pour vos autres structures de données.

+0

Cela semble être une bonne idée de créer des constructeurs pour ces structures car elles semblent être hors de contrôle! – binarycreations

2

Il semble que la zone de délimitation devrait contenir uniquement des flottants, pas des points?

Cela dit cela pourrait fonctionner:

Player player = { 
vector<float>(xcords,xcords + (sizeof(xcords)/sizeof(float))), //xcords of player 
vector<float>(ycords,ycords + (sizeof(ycords)/sizeof(float))), //ycoords of playe 
{{1.0,5.0},{1.0,5.0},{1.0,5.0},{1.0,5.0}}, 
1,1,1,           //red, green, blue 
0.0f,0.0f,        //r_leg,l_leg 
{4,4,4},        //number points per polygon 
true,false}; 

(non testé) ...