簡體   English   中英

返回結構而不初始化它

[英]Returning a struct without initializing it

我有一個非常簡單的顏色結構

struct {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha;
} RGBA;

現在在某個函數中,我想返回這樣的結構。

但我無法弄清楚如何做到這一點。 我能想到的只是創建一個局部結構,分別填充每個字段,然后返回它。

RGBA localStructure;
localStructure.red = r;
localStructure.green = g;
localStructure.blue = b;
localStructure.alpha = a;
return localStructure;

我真的想做這樣的事情

return RGBA(r,g,b,a);

有沒有辦法在C / C ++中實現這一目標?

首先,在你的第一個片段中,RGBA是一個對象,其類型是一個未命名的結構,我認為這不是你想要的。 你可能意味着:

typedef struct { ... } RGBA; /* what a lot of C programmers do */

要么

struct RGBA { ... }; /* probably what you meant */

無論如何,要回答你的問題,給它一個構造函數!

struct RGBA {
    RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) : red(r), green(g), blue(b), alpha(a) {
    }

    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha;
};

然后你可以寫:

return RGBA(r,g,b,a);

在C中,您可以使用此快捷方式初始化結構:

RGBA x = { r, g, b, a };

所以快速做你想做的事就是這樣:

return (RGBA) { r, g, b, a };

在C ++中,struct可以有一個構造函數。

struct RGBA{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha;

    RGBA( unsigned char _red, unsigned char _green, unsigned char _blue, unsigned char _alpha ) : red( _red ), green( _green ), blue( _blue ), alpha( _alpha )
    {}

};

struct { ... } RGBA定義未命名結構的對象RGBA。 你可能的意思是typedef struct { ... } RGBA; 然后你可以這樣做:

RGBA fun() {
    RGBA obj = { 0xff, 0xff, 0xff, 0 };
    return obj;
}

GCC支持C90模式和C ++模式下的復合C99文字 ,所以你可以這樣做:

RGBA fun() {
    return ((RGBA){ 0xff, 0xff, 0xff, 0 });
}

是的,聲明一個構造函數。

struct RGBA { 

   RGBA(unsigned char r, unsigned char g, unsigned b, unsigned char a = 0xff)
     : red(r)
     , green(g)
     , blue(b)
     , alpha(a)
   {
   }

   ...
};

然后像這樣使用它:

 RGBA t = RGBA(0xff,0xff,0);

或這個

 return RGBA(0,0,0,0xff);

注意:構造函數是必不可少的C ++特性。 你絕對應該在C ++中閱讀面向對象。 它會讓你的生活更幸福。

假設您的RGBA結構無法更改,例如第三方或需要在C中,並且您希望簡化C ++中的返回,那么您可以定義初始類型來完成工作:

struct RGBAInitialisor
{
    RGBAInitialisor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
        impl_.alpha = a;
        impl_.blue = b;
        impl_.green = g;
        impl_.red = r;
    }
    // This converts back to the RGBA on the fly.
    operator RGBA ()
    {
        return impl_;
    }
    RGBA impl_;

};

RGBA f()
{
    return RGBAInitialisor(1,2,3,4);
}

您可以創建一個類而不是一個結構(或保持結構),並為它提供一個帶有4個參數的構造函數。

C ++結構實際上是一個類,因此您可以向其中添加構造函數,然后提供代碼來初始化構造函數中的字段。

AC結構具有大小,因此如果要初始化所有字段,通常可以

RGBA localStructure;
memset(&localStructure, 0, sizeof(localStructure));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM