14

プログラム内にいくつかの異なる構造を作成しました。ネストされた構造を持つ構造ができましたが、それらを正しく初期化する方法がわかりません。構造を以下に示します。

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

しかし、コンパイラは bob に識別子がないか、いくつかの構文が欠落していると見なすため、これによりさらに多くのエラーが発生します。

問題をグーグル検索しましたが、(親) 構造内でネストされた構造のさまざまなメンバーを初期化する方法を示す記事は見つかりませんでした。この件に関するヘルプは大歓迎です:-) !!!

4

3 に答える 3

20

通常は次のように初期化します{ ... }

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 の場合は 、int の場合は 0 などで、ユーザー定義型のコンストラクターを大まかに使用します。ポイントを初期化する行は次のようになります

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

これで、ブレースの省略を使用する危険性がわかります。構造体にメンバーを追加すると、すべての初期化子が初期化する必要のある実際の要素から「離れて」移動し、誤って他の要素にヒットする可能性があります。したがって、必要に応じて常に中括弧を使用することをお勧めします。

ただし、コンストラクターの使用を検討してください。中括弧で囲まれた初期化子を使用してそれを行う方法を示すコードを完成させました。

于 2009-03-10T09:35:58.820 に答える
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);

これは、他のデータ構造でも機能します。

于 2009-03-10T09:30:26.667 に答える
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};  

(未テスト)..。

于 2009-03-10T09:48:14.750 に答える