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

这会导致几个不同的错误,关于 box. 在“。”之前说明该框没有明确的标识符并且缺少结构或语法。

然后我尝试创建一个 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点的成员,则可以通过省略其他初始化程序来实现。聚合(数组,结构)中的剩余元素将被初始化为“正确”值 - 因此,aNULL用于指针,afalse用于 bool,零用于 int 等等,并且大致使用用户定义类型的构造函数。初始化点的行看起来像这样

{ { 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 回答