【发布时间】:2011-02-09 00:14:05
【问题描述】:
我有一个关于工会的问题,我仍然不了解。我已经阅读了很多关于它们的用途,并且在大多数情况下可以看到它们如何有用并理解它们。我已经看到它们可以提供原始的“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字段与其他字段无关。这只是另一个领域。