2009-03-10 96 views
9

Tôi đã tạo một vài cấu trúc khác nhau trong một chương trình. Tôi bây giờ có một cấu trúc với cấu trúc lồng nhau tuy nhiên tôi không thể làm việc ra làm thế nào để khởi tạo chúng một cách chính xác. Các cấu trúc được liệt kê dưới đây.Cách khởi tạo cấu trúc lồng nhau trong 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;    
}; 

Sau đó, tôi cố gắng intialse Trình tạo cấu trúc người chơi mới được tạo là trình phát.

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

Điều này gây ra nhiều lỗi khác nhau, liên quan đến hộp. Nói rằng hộp không có định danh rõ ràng và thiếu cấu trúc hoặc cú pháp trước '.'.

sau đó tôi cố gắng chỉ để tạo ra một cấu trúc Player và khởi thành viên của nó như sau:

Player bob; 
bob.r_leg = 1; 

Nhưng điều này gây ra nhiều lỗi, như trình biên dịch nghĩ bob không có định danh hoặc thiếu một số cú pháp.

Tôi đã giải quyết được sự cố nhưng tôi không tìm thấy bất kỳ bài viết nào cho thấy cách làm cho nhiều thành viên khác nhau của cấu trúc lồng nhau trong cấu trúc (cha mẹ) lồng ghép. Bất kỳ trợ giúp về chủ đề này sẽ được đánh giá rất nhiều :-) !!!

+0

Tôi nhận ra đoạn này đã có vấn đề như các cửa hàng hộp Bounding điểm để cần ymax.x và ymax.y cần initalising . Tuy nhiên tôi đã thử điều này nhưng có cùng một lỗi. (ví dụ: tôi đã làm ymax.y = 5; ymax.x = 1; v.v.) – binarycreations

+0

vui lòng đính kèm lỗi. –

+0

Bạn nên khởi tạo chúng trong các hàm tạo. Bạn không muốn các giá trị không xác định. –

Trả lời

19

Bạn khởi tạo nó bình thường với { ... }:

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

Bây giờ, đó là sử dụng "cú đúp sự bỏ bớt". Một số trình biên dịch cảnh báo cho rằng, mặc dù nó là hoàn toàn tiêu chuẩn, bởi vì nó có thể gây nhầm lẫn cho người đọc. Tốt hơn bạn thêm niềng răng, vì vậy nó trở nên rõ ràng những gì được khởi tạo ở đâu:

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

Nếu bạn chỉ muốn để khởi tạo x viên của các điểm, bạn có thể làm như vậy bằng cách bỏ qua initializer khác. Các phần tử còn lại trong tập hợp (mảng, cấu trúc) sẽ là giá trị được khởi tạo cho giá trị "đúng" - do đó, NULL đối với con trỏ, false cho bool, 0 cho int và vv .. và sử dụng hàm tạo cho các kiểu do người dùng xác định. Hàng khởi tạo các điểm trông giống như thế này sau đó

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

Bây giờ bạn có thể thấy sự nguy hiểm của việc sử dụng dấu ngoặc nhọn. Nếu bạn thêm một số thành viên vào cấu trúc của mình, tất cả các trình khởi tạo sẽ được "dịch chuyển" các phần tử thực của chúng, chúng sẽ khởi tạo và chúng có thể tấn công các phần tử khác một cách vô tình. Vì vậy, bạn tốt hơn luôn luôn sử dụng niềng răng khi thích hợp.

Cân nhắc sử dụng các nhà thầu mặc dù.Tôi vừa hoàn thành mã của bạn cho thấy làm thế nào bạn sẽ làm điều đó bằng cách sử dụng brace kèm theo initializers.

4

Bạn có thể thêm các giá trị mặc định cho một cấu trúc như sau:

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

    float x; 
    float y; 
}; 

hoặc

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

    float x; 
    float y; 
}; 

Để thêm những giá trị trong quá trình xây dựng, bổ sung các thông số đơn vị thi công như thế này:

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

    float x; 
    float y; 
}; 

và khởi tạo chúng với các:

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

Điều này cũng phù hợp với các cấu trúc dữ liệu khác của bạn.

+0

Điều đó nghe có vẻ giống như một ý tưởng hay, để tạo ra các nhà thầu cho các cấu trúc này vì chúng dường như đang khá ra khỏi tầm tay! – binarycreations

2

Dường như hộp giới hạn chỉ nên chứa phao, không phải điểm?

Điều đó nói rằng điều này có thể làm việc:

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

(chưa được kiểm tra) ...

Các vấn đề liên quan