Если у меня есть класс:
class Odp
{
int i;
int b;
union
{
long f;
struct
{
WCHAR* pwszFoo;
HRESULT hr;
};
};
}
Объединение означает, что, всех значений перечислил, оно может только взять одно из тех значений за один раз? Как это работает с точки зрения доступа к этим переменным? Как я получил бы доступ hr
непосредственно? Если я установил hr
, что происходит, если я пытаюсь получить доступ f
?
Это очень сложная область в стандарте 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, что-то не так.
Каждый раз, когда вы устанавливаете (записываете в) член союза, вы, по сути, делаете его "активным". Вам разрешено читать только активный в данный момент член союза. Это означает, что вы обязаны каким-то образом запомнить, какой член активен в каждый момент времени.
Попытка получить доступ к неактивному члену союза приводит к неопределенному поведению.
Помните также, что ваш код не является корректным C++. В C++ не существует такого понятия, как "анонимная структура". Ваш член struct должен иметь имя. Если ваш компилятор принимает его, то это просто нестандартное расширение, поддерживаемое вашим конкретным компилятором.
Верно, при объединении
одни и те же области памяти будут использоваться для представления одного из членов в любой момент времени. Поэтому, если у вас есть экземпляр союза и вы установили значение hr
, вы получите мусор, если попытаетесь прочитать значение f
.
Попробуйте использовать следующее для доступа к hr
:
union a;
a.hr = NULL;
Это просто означает, что вы можете получить доступ к той же памяти, что и long, или struct.
Для доступа к hr
:
Odp o1;
o1.hr;
Интересная ссылка: http://www.cplusplus.com/forum/general/18816/