返回结构而不初始化它

时间:2011-02-15 15:16:05

标签: c++ c struct

我有一个非常简单的颜色结构,比如这个

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 ++中实现这个目标?

8 个答案:

答案 0 :(得分:7)

首先,在你的第一个片段中,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);

答案 1 :(得分:3)

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

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

所以快速做你想做的事就是这个:

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

答案 2 :(得分:3)

在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 )
    {}

};

答案 3 :(得分:2)

struct { ... } RGBA定义了未命名结构的对象RGBA。您可能意味着typedef struct { ... } RGBA;。然后你可以这样做:

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

GCC supports compound C99 literals in C90 mode and in C++,所以你可以做到:

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

答案 4 :(得分:1)

是的,声明一个构造函数。

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 ++中阅读面向对象。它会让你的生活更幸福。

答案 5 :(得分:1)

假设您的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);
}

答案 6 :(得分:0)

你可以创建一个类而不是一个struct(或保持一个struct),并给它一个带有4个参数的构造函数。

答案 7 :(得分:0)

C ++结构实际上是一个类,因此您可以向其中添加构造函数,然后提供代码来初始化构造函数中的字段。

C结构具有大小,因此如果要初始化所有字段,通常可以

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