如何在C++中初始化嵌套结构体?

16

我在一个程序中创建了几个不同的结构体。现在我有一个嵌套结构体,但我无法弄清楚如何正确地初始化它们。下面列出了这些结构体。

/***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没有标识符或缺少某些语法。

我在谷歌上搜索了这个问题,但是没有找到任何文章可以向我展示如何初始化嵌套结构中的许多不同成员(在父结构内)。任何关于这个主题的帮助都将非常感激 :-) !!!


我意识到这段代码已经存在问题,因为包围盒存储点需要初始化ymax.x和ymax.y。然而,我尝试过这样做,但仍然出现相同的错误(例如,我尝试了ymax.y = 5;ymax.x = 1等)。 - binarycreations
无论如何,您都应该在构造函数中初始化它们。您不希望出现未定义的值。 - Daniel Daranas
3个回答

21

你可以正常地使用{ ... }初始化它:

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 ,整数为零等等,对于用户定义类型则使用构造函数。初始化点的行看起来是这样的:
{ { 5 }, { 5 }, { 5 }, { 5 } }, 

现在你可以看到使用大括号省略的危险性。如果你向结构体中添加了一些成员,所有的初始化器都会将它们应该初始化的实际元素“分开”,并且它们可能会意外地影响其他元素。因此,在适当的情况下最好始终使用大括号。

考虑使用构造函数。我刚刚完成了你的代码,展示了如何使用大括号包含的初始化器来实现它。


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

这也适用于您的其他数据结构。

那听起来像个好主意,为这些结构体创建构造函数,因为它们似乎变得有些难以处理了! - 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};  

(未测试)...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接