Domanda

Ho creato un paio di strutture diverse in un programma. Ora ho una struttura con strutture nidificate ma non riesco a capire come inizializzarle correttamente. Le strutture sono elencate di seguito.

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

Provo quindi a 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ò causa diversi errori, riguardanti la casella. L'indicazione della casella non ha un identificatore chiaro e una struttura o sintassi mancante prima di ".".

Ho quindi provato a creare una struttura Player e a inizializzarne i membri come segue:

Player bob;
bob.r_leg = 1;

Ma questo causa più errori, in quanto il compilatore pensa che bob non abbia identificatore o manchi di sintassi.

Ho cercato su Google il problema ma non ho trovato alcun articolo che mi mostri come inizializzare molti diversi membri di strutture nidificate all'interno della struttura (genitore). Qualsiasi aiuto su questo argomento sarebbe molto apprezzato :-) !!!

È stato utile?

Soluzione

Lo inizializzi 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 "elise di rinforzo". Alcuni compilatori lo avvertono, anche se è completamente standard, perché potrebbe confondere i lettori. Meglio aggiungere parentesi graffe, quindi diventa chiaro cosa viene 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 vuoi solo inizializzare il membro x dei punti, puoi farlo omettendo l'altro inizializzatore. Gli elementi rimanenti negli aggregati (matrici, strutture) verranno inizializzati con il valore "diritto" valori - quindi, un NULL per i puntatori, un false per bool, zero per ints e così via, e usando approssimativamente il costruttore per tipi definiti dall'utente. La riga che inizializza i punti è simile a questa quindi

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

Ora potresti vedere il pericolo di usare l'elettrodo di rinforzo. Se aggiungi un membro alla tua struttura, tutti gli inizializzatori vengono "spostati" " i loro elementi reali dovrebbero essere inizializzati e potrebbero colpire altri elementi accidentalmente. Quindi è meglio usare sempre le parentesi graffe, se del caso.

Prendi in considerazione l'utilizzo dei costruttori. Ho appena completato il codice che mostra come lo faresti usando gli inizializzatori racchiusi tra parentesi graffe.

Altri suggerimenti

Puoi aggiungere valori predefiniti a una struttura come questa:

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

   float x;
   float y;
};

o

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

   float x;
   float y;
};

Per aggiungere quei valori durante la costruzione, aggiungi parametri a costruttori come questo:

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

Funziona anche con le altre tue strutture dati.

Sembra che il rettangolo di selezione debba contenere solo float, non punti?

Detto 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) ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top