繁体   English   中英

C ++从函数返回struct值

[英]C++ returning struct values from functions

因此,对于我的一个任务,我必须使用结构生成随机图形圆和矩形。 但我无法理解如何从一个函数输出结构。

   struct Circle{
   int x;
     int y;
     int radius;
     int r;
     int g;
     int b;
   };

   Circle createCirc() {
     int x = rand() % window_Width;
     int y = rand() % window_Height;
     int radius = rand() % 100;
     int r = rand()%256;
     int g = rand()%256;
     int b = rand()%256;
     return Circle(x,y,radius,r,g,b);
   }

在这里我用对象的基本值创建结构,然后我将一些数据从main传递给这个函数。

 Circle circle[1000];
 circle[count] = createCirc();

但是,我甚至无法让它运行,因为显然在定义结构本身时它带有这个错误:

main.cpp:47:8:注意:候选构造函数(隐式移动构造函数)不可行:需要1个参数,但是提供了6个

我只是不明白如何将函数中的数据传递给main中的varable。

您可以使用

 return Circle(x,y,radius,r,g,b);

只有当有明确定义的构造函数接受这些参数时。 将其更改为:

 return {x,y,radius,r,g,b};

第二种形式使用聚合初始化来构造Circle

struct Circle {
    int x;
    int y;
    int radius;
    int r;
    int g;
    int b;
};

您只是为类定义字段,而不是构造函数。

()初始化语法不允许执行您正在执行的操作。
但是,正如@RSahu的帖子所指出的, C ++ 11聚合初始化可以。

另一种方法是定义构造函数到类,可以选择使用成员初始化列表(见的几个原因这里为什么)。

从本质上讲,它会执行createCirc函数尝试执行的操作。 你可以这样定义它:

struct Circle {
    int x, y, radius, r, g, b;

    Circle();
};

Circle::Circle() :
    x{rand() % window_width},
    y{rand() % window_height},
    radius{rand() % 100},
    r{rand() % 256},
    g{rand() % 256},
    b{rand() % 256}
{}

这将允许你做像Circle myCircle;这样的事情Circle myCircle; 它会像你期望的那样初始化。

话虽这么说,构造函数不一定是最好的方法(IMO它隐藏了太多的行为),但这是一件好事。

只需在createCirc()函数中创建一个新的Circle并将其返回:

Circle createCirc() {
    Circle circle;
    circle.x = rand() % window_Width;
    circle.y = rand() % window_Height;
    circle.radius = rand() % 100;
    circle.r = rand()%256;
    circle.g = rand()%256;
    circle.b = rand()%256;
    return circle;
}

您还应该考虑使用vector进行动态分配和存储。

以下应该很好地工作。

struct Circle
{
    Circle(); // the default constructor
    int x;
    int y;
    int radius;
    int r;
    int g;
    int b;
};

Circle::Circle() : // start member-initialization list
   x( rand() % window_Width ),
   y( rand() % window_Height ),
   radius( rand() % 100 ),
   r( rand()%256 ),
   g( rand()%256 ),
   b( rand()%256 )
{
    // nothing to do!
}

我选择此实现有几个原因。 主要原因是您要构造其中的1000个并将它们存储在数组中。 创建对象数组时(假设它不是int数组或其他普通数据类型),将为每个元素调用默认构造函数 这就是我们在这里定义的内容。 通过使用成员初始化列表,我们将这些初始值更有效地提取到成员变量中,而不是将它们分配到构造函数的主体中。 这对int值来说并不是非常重要,但这是一个很好的习惯。

请注意,如果您想用其他值构造Circles ,那么使用此默认构造函数将浪费时间。 您需要定义另一个构造函数,该构造函数接受大小,位置和/或RGB值的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM