2009-03-10 8 views
9

Я создал пару различных структур в программе. У меня теперь есть структура с вложенными структурами, но я не могу решить, как правильно их инициализировать. Структуры перечислены ниже.Как инициализировать вложенные структуры в 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;    
}; 

Затем я пытаюсь внедрить недавно созданную структуру игрока, названную игроком.

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

Это вызывает несколько разных ошибок, связанных с коробкой. Если в поле нет четкого идентификатора и отсутствует структура или синтаксис до «.».

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

Player bob; 
bob.r_leg = 1; 

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

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

+0

Я понимаю, что этот фрагмент уже есть проблемы, как ограничивающий параллелепипед магазины точки, поэтому нужно ymax.x и ymax.y нужно initalising , Однако я попробовал это, но получил те же ошибки. (т. е. ymax.y = 5; ymax.x = 1 и т. д.) – binarycreations

+0

приложите ошибки. –

+0

Вы все равно должны инициализировать их в конструкторах. Вам не нужны неопределенные значения. –

ответ

19

Вы инициализировать его обычно с { ... }:

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 элемент точек, вы можете сделать это, опустив другой инициализатора. Остальные элементы в агрегатах (массивы, структуры) будут инициализированы значениями «правильные» значения - так, a NULL для указателей, false для bool, ноль для int и т. Д. И с использованием конструктора для пользовательских типов, грубо говоря. Строка, инициализирующая точки, выглядит следующим образом:

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

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

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

4

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

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

    float x; 
    float y; 
}; 

или

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

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

+0

Это звучит неплохо, чтобы создать конструкторы для этих структур, поскольку они, похоже, совершенно из-под контроля! – binarycreations

2

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

Это сказал, что это может работать:

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

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