2009-03-10 5 views
9

Ho creato un paio di strutture differenti in un programma. Ora ho una struttura con strutture nidificate, tuttavia non riesco a capire come inizializzarle correttamente. Le strutture sono elencate di seguito.Come inizializzare le strutture nidificate in C++?

/***POINT STRUCTURE***/ 
struct Point{ 
    float x;     //x coord of point 
    float y;     //y coord of point 
}; 

/***Bounding Box STRUCTURE***/ 
struct BoundingBox{ 
    Point ymax, ymin, xmax, xmin; 
}; 

/***PLAYER STRUCTURE***/ 
struct Player{ 
    vector<float> x;   //players xcoords 
    vector<float> y;   //players ycoords 
    BoundingBox box; 
    float red,green,blue;  //red, green, blue colour values 
    float r_leg, l_leg;   //velocity of players right and left legs 
    int poly[3];    //number of points per polygon (3 polygons) 
    bool up,down;    
}; 

Quindi tento di intialse una struttura Player appena creata chiamata player.

//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 

Ciò provoca diversi errori diversi relativi alla casella. Dichiarare la scatola non ha identificatore chiaro e struct o sintassi mancanti prima di '.'.

Allora ho provato solo per creare una struct Player e inizializzare i suoi membri come segue:

Player bob; 
bob.r_leg = 1; 

Ma questo provoca più errori, come il compilatore pensa bob non ha alcun identificativo o mancano alcuni sintassi.

Ho cercato su google il problema, ma non ho trovato nessun articolo che dimostri come inizializzare molti diversi membri di strutture nidificate all'interno della struttura (principale). Qualsiasi aiuto su questo argomento sarebbe molto apprezzato :-) !!!

+0

Mi rendo conto che questo frammento ha già problemi come la scatola negozi Limitrofi punti in modo bisogno ymax.x e ymax.y bisogno, inizializzazione . Comunque ho provato questo, ma ho avuto gli stessi errori. (Ad esempio, ho fatto ymax.y = 5; ymax.x = 1; ecc. ecc.) – binarycreations

+0

allegare gli errori. –

+0

Si consiglia di inizializzarli comunque nei costruttori. Non vuoi valori non definiti. –

risposta

19

si inizializza normalmente con { ... }:

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 
}; 

Ora, che sta usando "brace elision". Alcuni compilatori avvisano per questo, anche se è completamente standard, perché potrebbe confondere i lettori. Meglio si aggiunge bretelle, così diventa chiaro che cosa si inizializzato dove:

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 
}; 

Se si desidera solo inizializzare il x membro dei punti, è possibile farlo omettendo l'altro inizializzatore. Gli elementi rimanenti in aggregati (matrici, strutture) saranno inizializzati a valori "giusti", quindi un NULL per i puntatori, un false per bool, zero per ints e così via e utilizzando approssimativamente il costruttore per i tipi definiti dall'utente. La riga che inizializza i punti appare come questa quindi

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

Ora è possibile vedere il pericolo dell'uso di controvento elisione. Se aggiungi un membro alla tua struct, tutti gli inizializzatori vengono "spostati" i loro elementi reali che dovrebbero inizializzare e potrebbero colpire accidentalmente altri elementi. Quindi è meglio usare sempre le parentesi se appropriato.

Tuttavia, è consigliabile utilizzare i costruttori.Ho appena completato il codice che mostra come lo si farebbe utilizzando gli inizializzatori inclusi.

4

È possibile aggiungere valori di default ad una struttura in questo modo:

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

    float x; 
    float y; 
}; 

o

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

    float x; 
    float y; 
}; 

Per l'aggiunta di quei valori durante la costruzione, aggiungere i parametri ai costruttori in questo modo:

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

    float x; 
    float y; 
}; 

e istanziali con questi:

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

Questo funziona anche per le altre strutture di dati.

+0

Mi sembra una buona idea creare costruttori per queste strutture che sembrano essere fuori controllo! – binarycreations

2

Sembra che il riquadro di delimitazione debba contenere solo caratteri mobili, non punti?

che dicono che questo potrebbe funzionare:

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}; 

(testato) ...