Jak inicializovat vnořené struktury v jazyce C ++?

hlasů
9

Vytvořil jsem několik různých struktur v rámci programu. Nyní mám strukturu s vnořenými strukturami ale nemohu zjistit, jak je správně inicializovat. Tyto struktury jsou uvedeny níže.

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

pak se pokusím intialse nově vytvořené s názvem hráče struct.

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

To způsobí, že několik různých chyb, které se týkají poli. Uvedením box nemá jasnou identifikaci a chybějící struct nebo syntaxe před ‚‘.

Pak jsem se snažil jen vytvořit hráče struct a inicializaci je členy takto:

Player bob;
bob.r_leg = 1;

Ale to způsobí další chyby, protože kompilátor si myslí, že bob nemá identifikátor nebo chybí některé syntaxe.

I googled problém, ale jsem nenašel žádné články, které ukazují mi, jak initalise mnoho různých členů vnořených struktur uvnitř (mateřskou) strukturou. Jakákoli pomoc v této věci by bylo velmi ocenil :-) !!!

Položena 10/03/2009 v 10:28
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
19

Můžete jej inicializovat normálně { ... }:

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

Nyní, který používá „rovnátka vynechání“. Některé kompilátory varují za to, že i když je zcela standardní, protože by to mohlo zmást čtenáře. Lepší přidat rovnátka, takže je jasné, co se inicializuje, jestliže:

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

Chcete-li pouze k inicializaci xčlen body, můžete tak učinit tím, že vynechá druhý inicializátor. Zbývající prvky ve shlucích (pole, structs) bude hodnota inicializuje na hodnoty „správné“ - tak, je NULLpro ukazatele, je falsepro BOOL nula pro ints a tak dále, a pomocí konstruktoru pro uživatelem definované typy, hrubě. Řádek inicializace body vypadá to pak

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

Teď jste mohli vidět nebezpečí pomocí závorek vynechání. Přidáte-li nějaké člena vaší struct všechny inicializátory jsou „posunuty od sebe“ své skutečné prvky by měly zahájit, a mohly zasáhnout další prvky náhodně. Takže je lepší používat závorky vždy, kdy je to vhodné.

Zvážit použití konstruktory ačkoli. Právě jsem dokončil svůj kód ukazuje, jak byste to udělat pomocí závorky uzavřeny inicializátory.

Odpovězeno 10/03/2009 v 10:35
zdroj uživatelem

hlasů
4

Můžete přidat výchozí hodnoty na strukturu jako tak:

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

   float x;
   float y;
};

nebo

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

   float x;
   float y;
};

Pro přidání těchto hodnot v průběhu výstavby, přidat parametry konstruktérů, jako je tento:

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

   float x;
   float y;
};

a konkretizovat je s nimi:

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

Toto funguje také pro jiné datové struktury.

Odpovězeno 10/03/2009 v 10:30
zdroj uživatelem

hlasů
2

Vypadá to, že ohraničující rámeček měl prostě obsahovat plováky, nikoliv body?

To znamená, že by to mohlo fungovat:

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

(Nevyzkoušený) ...

Odpovězeno 10/03/2009 v 10:48
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more