gpt4 book ai didi

c++ - 包含“类型”成员的 union

转载 作者:可可西里 更新时间:2023-11-01 18:19:17 24 4
gpt4 key购买 nike

我有一个关于 union 的问题,我仍然不了解。我已经阅读了很多关于它们的用途,并且在大多数情况下可以看到它们如何有用并理解它们。我已经看到它们可以提供原始的“C 风格”多态性。我在几个网站上看到的例子是 SDL 的事件 union :

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;

我不明白的是,上面怎么会有一个“类型”成员与事件类型共存?由于它们占用相同的内存区域,难道它们不能一次只允许存在一个吗? union 不会作为一种类型或事件之一随时存在吗?

我理解每个事件实际上是一个带有类型成员的结构,例如:

// SDL_MouseButtonEvent

typedef struct{
  Uint8 type;
  Uint8 button;
  Uint8 state;
  Uint16 x, y;
} SDL_MouseButtonEvent;

这有什么意义吗?这是否以某种方式允许 union 的类型成员表示 union 当前的任何结构的类型?当 union 体中除一个成员之外的每个成员都是一个结构并且每个结构都包含该成员时,是否会发生某种奇怪的效果?

是否可以在不知道对象是哪个结构的情况下访问结构成员?

谢谢!

最佳答案

如果每个事件类型都有一个 Uint8 作为其第一个数据成员,那么 uniontype 成员只是一种方便.

union 的一般规则是您只能使用您写入的最后一个数据成员访问 union 中的数据。因此,如果您上次写入 active,则接下来无法从 key 读取。

此规则的一个异常(exception)是,如果 union 的多个成员共享相同的前缀(如果它们的第一个数据成员相同),您可以通过 union 的任何数据成员访问该前缀前缀。因此,在这里,您可以引用 active.typekey.type,无论 union 的哪个数据成员处于事件状态,它都会起作用。

SDL_Eventtype 成员只是一个方便的快捷方式,它允许您访问该 type 字段而无需将其限定为 event_object.active.typeevent_object.key.type。您可以只使用 event_object.type

关于c++ - 包含“类型”成员的 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4940064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com