Возврат структуры без ее инициализации - PullRequest
3 голосов
/ 15 февраля 2011

У меня очень простая цветовая структура, подобная этой

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 ]

7 голосов
/ 15 февраля 2011

Во-первых, в вашем первом фрагменте 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);
3 голосов
/ 15 февраля 2011

В C ++ структура может иметь конструктор.

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 голосов
/ 15 февраля 2011

В C вы можете инициализировать структуры с помощью этого ярлыка :

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

Так что быстрый способ сделать то, что вы хотите, может быть таким:

return (RGBA) { r, g, b, a };
2 голосов
/ 15 февраля 2011

struct { ... } RGBA определяет объект RGBA безымянной структуры.Что вы, вероятно, имеете в виду, это typedef struct { ... } RGBA;.Затем вы можете сделать:

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

GCC поддерживает составные литералы C99 в режиме C90 и в C ++ , так что вы можете сделать:

RGBA fun() {
    return ((RGBA){ 0xff, 0xff, 0xff, 0 });
}
1 голос
/ 16 февраля 2011

Предположим, что ваша структура RGBA не может быть изменена, например, третья сторона или должна быть в C, и ваше желание упростить ваш возврат в C ++, тогда вы можете определить тип инициализатора для выполнения работы:*

1 голос
/ 15 февраля 2011

Да, объявить конструктор.

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 ++. Это сделает вашу жизнь намного счастливее.

0 голосов
/ 15 февраля 2011

Структура C ++ на самом деле является классом, поэтому вы можете добавить в него конструктор и затем предоставить код для инициализации полей в конструкторе.

Структура C имеет размер, поэтому, если вы хотите инициализировать все поля, вы обычно можете

RGBA localStructure;
memset(&localStructure, 0, sizeof(localStructure));
0 голосов
/ 15 февраля 2011

Вы можете создать класс вместо структуры (или оставить его структурой) и присвоить ему конструктор с 4 параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...