У меня вопрос о том, чего я до сих пор не понимаю в профсоюзах. Я читал об их использовании и по большей части вижу, чем они могут быть полезны, и понимаю их. Я видел, что они могут обеспечить примитивный полиморфизм в стиле C. Примером этого, который я видел на нескольких веб-сайтах, является объединение событий SDL:
typedef union {
Uint8 type;
SDL_ActiveEvent active;
SDL_KeyboardEvent key;
SDL_MouseMotionEvent motion;
SDL_MouseButtonEvent button;
SDL_JoyAxisEvent jaxis;
SDL_JoyBallEvent jball;
SDL_JoyHatEvent jhat;
SDL_JoyButtonEvent jbutton;
SDL_ResizeEvent resize;
SDL_ExposeEvent expose;
SDL_QuitEvent quit;
SDL_UserEvent user;
SDL_SysWMEvent syswm;
} SDL_Event;
Я не могу понять, как там может сосуществовать член "типа" с типами событий? Разве им не разрешено существовать только по одному, поскольку они занимают одну и ту же область памяти? Разве союз не существовал бы когда-либо как тип или как одно из событий?
Я понимаю, что каждое событие на самом деле представляет собой структуру с членом типа, например:
// SDL_MouseButtonEvent
typedef struct{
Uint8 type;
Uint8 button;
Uint8 state;
Uint16 x, y;
} SDL_MouseButtonEvent;
Какой в этом смысл? Позволяет ли это каким-то образом члену типа объединения представлять тип любой структуры, которая в настоящее время является объединением? Это какой-то странный эффект, который происходит, когда каждый член союза, кроме одного, является структурой, и каждая структура содержит этот один член?
Можете ли вы получить доступ к членам структуры, не зная, какой структурой является объект?
Спасибо!
Uint8 type
связано с другими полями. Я считаю, что полеtype
не имеет ничего общего с другими полями. Это просто еще одно поле. - person Thomas Matthews   schedule 09.02.2011