Объединение C++, Структура, Тип элемента

Если у меня есть класс:

class Odp
{
    int i;
    int b;
    union
    {
         long f;
         struct
         {
               WCHAR* pwszFoo;
               HRESULT hr;
         };
    };

}

Объединение означает, что, всех значений перечислил, оно может только взять одно из тех значений за один раз? Как это работает с точки зрения доступа к этим переменным? Как я получил бы доступ hr непосредственно? Если я установил hr, что происходит, если я пытаюсь получить доступ f?

5
задан timrau 8 October 2012 в 15:38
поделиться

4 ответа

Это очень сложная область в стандарте C ++ - в основном, экземпляр union по стандарту может обрабатываться только в любой момент времени, как если бы он содержал один «активный» член - последний. написано к нему. Итак:

union U {
   int a;
   char c;
};

, затем:

U u;
u.a = 1;
int n = u.a;
u.c = 2;
char c = u.c;

в порядке, но:

U u;
u.a = 1;
char c = u.c;

- нет. Однако существуют огромные объемы существующего кода, которые говорят, что оба в порядке. и ни в том, ни в другом случае не будет создано исключение для «недействительного» доступа. Язык C ++ использует исключения исключительно (!) Экономно.

По сути, если вы обнаружите, что используете объединения в коде C ++ для работы с чем-либо, кроме библиотек C, что-то не так.

8
ответ дан 18 December 2019 в 11:53
поделиться

Каждый раз, когда вы устанавливаете (записываете в) член союза, вы, по сути, делаете его "активным". Вам разрешено читать только активный в данный момент член союза. Это означает, что вы обязаны каким-то образом запомнить, какой член активен в каждый момент времени.

Попытка получить доступ к неактивному члену союза приводит к неопределенному поведению.

Помните также, что ваш код не является корректным C++. В C++ не существует такого понятия, как "анонимная структура". Ваш член struct должен иметь имя. Если ваш компилятор принимает его, то это просто нестандартное расширение, поддерживаемое вашим конкретным компилятором.

4
ответ дан 18 December 2019 в 11:53
поделиться

Верно, при объединении одни и те же области памяти будут использоваться для представления одного из членов в любой момент времени. Поэтому, если у вас есть экземпляр союза и вы установили значение hr, вы получите мусор, если попытаетесь прочитать значение f.

Попробуйте использовать следующее для доступа к hr:

union a;
a.hr = NULL;
2
ответ дан 18 December 2019 в 11:53
поделиться

Это просто означает, что вы можете получить доступ к той же памяти, что и long, или struct.

Для доступа к hr :

Odp o1;
o1.hr;

Интересная ссылка: http://www.cplusplus.com/forum/general/18816/

1
ответ дан 18 December 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: