[英]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.