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