2009-03-10 38 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;    
}; 

次に、新しく作成された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 

これは、ボックスに関するいくつかの異なるエラーを引き起こします。ボックスに明示的な識別子がなく、 '。'の前に構造体や構文がありません。

私は、ちょうどPlayerの構造体を作成し、以下のようにそれがメンバーだ初期化してみました:

Player bob; 
bob.r_leg = 1; 

をしかし、コンパイラはボブが何の識別子を持っていないか、いくつかの構文が欠落していると考えると、これは、より多くのエラーが発生します。

私はその問題を尋ねましたが、(親)構造内のネストされた構造の多くの異なるメンバーをどのように初期化するかを示す記事は見つかりませんでした。この件に関する助けがあれば、大いに感謝します.-) !!! 、建設中にこれらの値を追加するための

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

    float x; 
    float y; 
}; 

または

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

    float x; 
    float y; 
}; 

このようなコンストラクタにパラメータを追加します:

+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メンバーを初期化したい場合は、あなたが他の初期化子を省略することによって行うことができます。集約(配列、構造体)の残りの要素は、 "正しい"値に初期化された値になります。ポインタの場合はNULL、boolの場合はfalse、intの場合は0などです。ポイントを初期化する行は、次のようになります。

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

これで、ブレースエリートを使用する危険性が分かりました。あなたの構造体にいくつかのメンバを追加すると、すべてのイニシャライザは、それらを初期化する必要がある実際の要素を「移動して離して」しまい、誤って他の要素にヒットする可能性があります。したがって、必要に応じて常にブレースを使用することをお勧めします。

コンストラクタの使用を検討してください。私はあなたのコードを完成させて、中括弧で囲まれたイニシャライザを使ってどのように行うのかを示しています。

4

あなたはそうのような構造にデフォルト値を追加することができます

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

(未テスト)...

関連する問題