Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Закрепить обращение к конкретному члену union'a


Автор: flagist0 25.7.2008, 10:39
Во избежание выравнивания, структура объединена в унионе с массивом размера структуры. Обращений к массиву не происходит, но к структуре все равно приходится обращаться в стиле union->struct.someprop, что сильно снижает читаемость. Есть ли метод закрепить доступ к конкретному члену юниона (очень желательно без макросов, по причине той же читаемости)?

Автор: flagist0 25.7.2008, 10:56
Проявился вариант, можно переопределить оператор -> union'а. 
Но как? mystruct* operator->(){return &mystruct_union_member;} компилируется, но при попытке обращения через стрелку напрямую к члену структуры выдается 'has no member blah'

Автор: HappyLife 25.7.2008, 17:32
Код

union Union
{
struct Struct
{
        int i;
} s;
Struct * operator->(){return &s;};
} u;

int main(int argc, char* argv[])
{
        u->i = 10;

        return 0;
}


Работает.

Автор: jonie 25.7.2008, 21:31
Цитата

Во избежание выравнивания, структура объединена в унионе с массивом размера структуры
а как это предотвращает выравнивание полей структуры?

идея как я понимаю такая(пример):
Код

union {
    struct {
        char c;
        int a;
    }st;

    char _arr[sizeof(int)+sizeof(char)];
}su;

printf("%d", sizeof(su)); //далеко не факт что тут будет 5. скорее всего будет 8 (на х86)....



//хотя наверно имеется в виду такое:
// (но лично у меня такая структура с выравниваем 8 занимает 8 байтов...)...
union {
    struct {
        char c[4];
        int a;
    }st;

    int _arr[2];
}su;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)