簡體   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