2009-03-10 14 views
9

Stworzyłem kilka różnych struktur w programie. Mam teraz strukturę ze strukturami zagnieżdżonymi, ale nie mogę ustalić, jak poprawnie je zainicjować. Struktury są wymienione poniżej.Jak zainicjować struktury zagnieżdżone w 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;    
}; 

Następnie próbuję wprowadzić nową strukturę gracza o nazwie 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 

Powoduje to kilka różnych błędów dotyczących skrzynki. Podając pole nie ma wyraźnego identyfikatora i brakuje struktury lub składni przed ".".

Następnie próbowałem po prostu stworzyć struct gracza i zainicjować jego członków, co następuje:

Player bob; 
bob.r_leg = 1; 

Ale to powoduje więcej błędów, ponieważ kompilator uważa Bob ma identyfikator lub brakuje trochę składnię.

Przeanalizowałem problem, ale nie znalazłem artykułów, które wskazywałyby, jak zainicjować wiele różnych elementów struktur zagnieżdżonych w strukturze (macierzystej). Każda pomoc na ten temat byłaby bardzo cenna :-) !!!

+0

Rozumiem to fragment ma już problemy jak sklepach obwiedni punkty więc muszą ymax.x i ymax.y trzeba initalising . Jednak próbowałem tego, ale dostałem te same błędy. (tj. zrobiłem: ymax.y = 5; ymax.x = 1; itp.)) – binarycreations

+0

proszę dołączyć błędy. –

+0

W każdym razie powinieneś zainicjować je w konstruktorze. Nie chcesz niezdefiniowanych wartości. –

Odpowiedz

19

zainicjować go normalnie { ... }:

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

teraz, że używa "nawiasów elizja". Niektóre kompilatory ostrzegają o tym, mimo że są całkowicie standardowe, ponieważ mogą wprowadzać w błąd czytelników. Lepiej dodać szelki, więc staje się jasne, co jest inicjowany gdzie:

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

Jeśli chcesz tylko zainicjować członek punktów x, można to zrobić przez pominięcie innych inicjatora. Pozostałe elementy w agregatach (tablice, elementy) będą wartościami zainicjowanymi na "prawidłowe" wartości - tak więc, NULL dla wskaźników, false dla bool, zero dla ints i tak dalej, i przy użyciu konstruktora dla typów zdefiniowanych przez użytkownika, z grubsza. Wiersz inicjalizujący punkty wygląda teraz tak, jak wtedy, gdy można zauważyć niebezpieczeństwo użycia ele- mentu usztywnienia. Jeśli dodasz jakiegoś członka do swojej struktury, wszystkie inicjalizatory zostaną "przesunięte" na swoje rzeczywiste elementy, które powinny zainicjować, i mogą przypadkowo trafić inne elementy. Więc lepiej zawsze używaj szelek w razie potrzeby.

Należy jednak rozważyć użycie konstruktorów.Właśnie zakończyłem twój kod pokazujący, jak zrobiłbyś to za pomocą zamkniętych inicjatorów.

4

Możesz dodać domyślne wartości do struktury tak:

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

    float x; 
    float y; 
}; 

lub

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

    float x; 
    float y; 
}; 

Aby dodać te wartości w trakcie budowy, dodać parametry do konstruktorów tak:

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

    float x; 
    float y; 
}; 

i stwórz je w następujący sposób:

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

Działa to również w przypadku innych struktur danych.

+0

To brzmi jak dobry pomysł, do tworzenia konstruktorów dla tych struktur, ponieważ wydają się być całkiem wymykają się spod kontroli! – binarycreations

2

Wygląda na to, że ramka ograniczająca powinna zawierać tylko elementy pływające, a nie punkty?

Powiedział, że to może działać:

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

(Nietestowane) ...