Как инициализировать вложенные структуры в 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;               
};

Затем я пытаюсь инициализировать только что созданную структуру Player с именем 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

Это вызывает несколько различных ошибок, касающихся box. Заявление, что поле не имеет четкого идентификатора и отсутствует структура или синтаксис перед '.'.

Затем я попытался просто создать структуру Player и инициализировать ее члены следующим образом:

Player bob;
bob.r_leg = 1;

Но это вызывает больше ошибок, поскольку компилятор считает, что у bob нет идентификатора или отсутствует какой-то синтаксис.

Я искал проблему в Google, но не нашел статей, показывающих мне, как инициализировать множество различных членов вложенных структур внутри (родительской) структуры. Любая помощь по этому поводу будет принята с благодарностью :-) !!!


person binarycreations    schedule 10.03.2009    source источник
comment
Я понимаю, что у этого фрагмента уже есть проблемы, так как ограничивающая рамка хранит точки, поэтому ymax.x и ymax.y нуждаются в инициализации. Однако я попробовал это, но получил те же ошибки. (т.е. я сделал ymax.y = 5; ymax.x = 1 и т. д.)   -  person binarycreations    schedule 10.03.2009
comment
В любом случае вы должны инициализировать их в конструкторах. Вам не нужны неопределенные значения.   -  person Daniel Daranas    schedule 10.03.2009


Ответы (3)


Вы обычно инициализируете его с помощью { ... }:

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

Теперь это использование "скобки". Некоторые компиляторы предупреждают об этом, даже если это полностью стандартно, потому что это может запутать читателей. Лучше фигурные скобки добавить, чтобы стало понятно, что и где инициализируется:

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

Если вы хотите инициализировать только x член точек, вы можете сделать это, опуская другой инициализатор. Остальные элементы в агрегатах (массивы, структуры) будут иметь значение, инициализированное "правильными" значениями - так, NULL для указателей, false для bool, ноль для целых чисел и так далее, и примерно с использованием конструктора для пользовательских типов. Строка, инициализирующая точки, выглядит так, тогда

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

Теперь вы могли увидеть опасность использования скобок. Если вы добавляете какой-либо член в свою структуру, все инициализаторы «раздвигаются» по своим фактическим элементам, которые они должны инициализировать, и они могут случайно попасть в другие элементы. Так что лучше всегда использовать скобки там, где это необходимо.

Однако подумайте об использовании конструкторов. Я только что завершил ваш код, показывая, как вы это сделаете, используя инициализаторы, заключенные в фигурные скобки.

person Johannes Schaub - litb    schedule 10.03.2009

Вы можете добавить значения по умолчанию в такую ​​структуру:

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

   float x;
   float y;
};

or

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

   float x;
   float y;
};

Чтобы добавить эти значения во время строительства, добавьте параметры в конструкторы следующим образом:

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

   float x;
   float y;
};

и создайте их с помощью этих:

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

Это также работает для других ваших структур данных.

person MrValdez    schedule 10.03.2009
comment
Это звучит как хорошая идея - создавать конструкторы для этих структур, поскольку они, похоже, выходят из-под контроля! - person binarycreations; 10.03.2009

Похоже, что ограничивающая рамка должна содержать только числа с плавающей запятой, а не точки?

Тем не менее, это может сработать:

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

(Не проверено) ...

person Douglas Leeder    schedule 10.03.2009