C ++从函数返回结构值

时间:2018-11-06 19:14:05

标签: c++

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

   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:注意:候选构造函数(隐式move构造函数)不可行:需要1个参数,但提供了6个参数

我只是不明白如何将数据从函数传递到main中的变量中。

4 个答案:

答案 0 :(得分:10)

您可以使用

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

仅当有一个显式定义的构造函数接受这些参数时。更改为:

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

第二种形式使用aggregate initialization来构建Circle

答案 1 :(得分:1)

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

您仅定义类的字段,而不是构造函数。

()初始化语法不允许做您正在做的事情。
但是,正如@RSahu的帖子所指出的,C++11 aggregate-initialization可以。

另一种选择是为类定义a constructor,可以选择使用成员初始化列表(请参见一些原因here为何)。

从本质上讲,它将执行您的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;的操作,并且将按照您的期望进行初始化。

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

答案 2 :(得分:1)

只需在您的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进行动态分配和存储。

答案 3 :(得分:0)

以下内容应该很好用。

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值的参数。