在Union event的SDL的API文档中,它表示字段类型在union中的所有事件(对象)之间共享,这怎么可能?
例如,这是完全合法的
while(SDL_PollEvent(&event)){
if(event.type == SDL_KEYDOWN){
cout << "key down" << endl;
}
这也是我在逻辑上更有意义的作品,但我不确定第一个是否合法
while(SDL_PollEvent(&event)){
if(event.key.type == SDL_KEYDOWN){
cout << "key down" << endl;
}
联合体有可能代表多种可能类型/结构中的一种。
union {
int i;
float f;
char c;
};
在上面的例子中,保持联合的记忆可以代表int
或float
或char
。但它只能是其中之一;他们是互相排斥的。联合重叠每个成员使用的底层字节以节省空间,并假设您将知道如何正确解释它。
(旁注:为了适应这种情况,联合的'大小' - 存储联合的字节云 - 必须足够大以保持联合中定义的最大可能类型。在这种情况下,int或float可以每个都是4个字节,因此联合将至少为4个字节。)
这种重叠记忆'技巧'的一个巧妙的副作用;如果一个联盟描述了多个struct
成员,那么他们可以共享共同的字段。
例:
union {
struct {
int type;
int i;
} OPTION_INT;
struct {
int type;
float f;
} OPTION_FLOAT;
struct {
int type;
char c;
} OPTION_CHAR;
};
好的,整洁联盟可以代表三种可能结构中的任何一种。但请注意;他们都包含完全相同的第一个成员 - type
。由于内存“重叠”的方式,OPTION_INT type
成员与OPTION_FLOAT和OPTION_CHAR type
成员共享相同的内存。因此,无论哪个选项是正确的,type
成员应该始终存在。这是可能的,因为它们都将type
字段定义为第一个成员。
工会 - 得到了爱情:)在Java中没有真正的等价物,因此许多Java开发人员发现它们很奇特。联合在概念上有点像抽象类 - 单个联合可以包含不同类型的数据。数据类型通常具有一种父子继承关系 - 它们就是这种情况 - 但它们并不是必需的。例如,看到由整数和双精度组成的联合并不罕见 - 在这种情况下,这不是包含整数和双精度的数据结构,而是包含整数或双精度的数据结构,在一些特定的记忆中。实际使用的类型必须在运行时确定。
在这种情况下,SDL_Event联合模拟了许多不同类型的事件。第一个字段type
指示应如何解释其余数据。如果类型是SDL_KEYDOWN
,那么union应该被解释为SDL_KeyboardEvent类型的结构。 SDL_KeyboardEvent的第一个字段也是type
- 这是有道理的,因为它被打包到与“base”SDL_Event相同的空间中。您可以将type
(一点点)视为“基础”SDL_Event的属性,它可以是(某种)由特定子类型继承的。我在这里有点狡猾,因为这个类比并不是那么强大。
在任何情况下,编译器都将确保SDL_Event足够大,以存储它定义包含的任何不同结构。除了type
之外,具体结构SDL_DropEvent
,SDL_KeyboardEvent
等没有太多共同点,通过查看它们的定义可以看出。
在Java AWT中,事件类执行与SDL中的SDL_Event联合几乎完全相同的角色。