关于工会,我有一个关于我仍然不明白的问题。我读过它们的很多用途,并且大部分都可以看到它们如何有用并理解它们。我已经看到它们可以提供原始的“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;
这有什么意义呢?这是否以某种方式允许联合的类型成员代表联合当前的任何结构的类型?当联合体中除一个成员之外的每个成员都是一个结构体并且每个结构体都包含该一个成员时,是否会发生某种奇怪的效果?
您可以在不知道对象是哪个结构的情况下访问结构成员吗?
Thanks!
如果每个事件类型都有一个Uint8
作为其第一个数据成员,然后type
的成员union
只是一个方便。
联合的一般规则是,您只能使用写入的最后一个数据成员来访问联合中的数据。所以,如果您上次写信给active
,您接下来无法读取key
.
此规则的一个例外是,如果联合体的多个成员共享相同的前缀(如果它们的第一个数据成员相同),则您可以通过共享该前缀的联合体的任何数据成员访问该前缀。所以,这里你可以参考一下active.type
or key.type
,无论联合体的哪个数据成员处于活动状态,它都会起作用。
The type
成员SDL_Event
只是一个方便的快捷方式,可让您访问该内容type
字段,而无需将其限定为event_object.active.type
or event_object.key.type
。你可以只使用event_object.type
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)