SFML 2.1 C++文档-实际上是sf::Event的一个联合

SFML 2.1 C++ documentation - is sf::Event really a union?

本文关键字:一个 Event SFML 文档 C++ 实际上 sf      更新时间:2023-10-16

在阅读SFML 2.1的文档时,我偶然发现了以下内容:

在处理事件之前,重要的是要了解sf::Event类型是什么,以及如何正确使用它。sf::Event是一个联合,这意味着一次只有一个成员有效(记住C++课程:联合的所有成员共享同一内存空间)。

然而,在检查sf::Event的声明时,我发现:

    class Event
    {
    public :
        ////////////////////////////////////////////////////////////
        /// brief Size events parameters (Resized)
        ///
        ////////////////////////////////////////////////////////////
        struct SizeEvent
        {
            unsigned int width;  ///< New width, in pixels
            unsigned int height; ///< New height, in pixels
        }; 
.....
 EventType type; ///< Type of the event
....

sf::Event不能是并集,因为例如,sf::Event::EventType不与sf::Event的任何其他成员共享内存区域,这在定义中有明确定义。

我看到的唯一的并集声明如下,再次取自类定义:

union
    {
        SizeEvent            size;            ///< Size event parameters (Event::Resized)
        KeyEvent             key;             ///< Key event parameters (Event::KeyPressed, Event::KeyReleased)
        TextEvent            text;            ///< Text event parameters (Event::TextEntered)
        MouseMoveEvent       mouseMove;       ///< Mouse move event parameters (Event::MouseMoved)
        MouseButtonEvent     mouseButton;     ///< Mouse button event parameters (Event::MouseButtonPressed, Event::MouseButtonReleased)
        MouseWheelEvent      mouseWheel;      ///< Mouse wheel event parameters (Event::MouseWheelMoved)
        JoystickMoveEvent    joystickMove;    ///< Joystick move event parameters (Event::JoystickMoved)
        JoystickButtonEvent  joystickButton;  ///< Joystick button event parameters (Event::JoystickButtonPressed, Event::JoystickButtonReleased)
        JoystickConnectEvent joystickConnect; ///< Joystick (dis)connect event parameters (Event::JoystickConnected, Event::JoystickDisconnected)
    };

那么,我是遗漏了什么,还是只是文档中的一个真正错误?

它不是一个联合,并且由于枚举类型成员甚至不像类那样是一个联合

9.5.8

类联合类是一个联合或具有匿名联合的类作为直接成员。类X的并集有一组可变成员。

你可以自己检查一下:

class IsUnion {
  public:
  struct struct1 {
      float tt;
  };
  struct struct2 {
      float tt;
  };
  enum EventType { no, yes };
  EventType type; 
  union
  {
      struct1 obj;
      struct2 obj2;
  };
};
int main() {
    cout << is_union<IsUnion>::value; // 0
}

示例

不管怎样,这个类的大部分由一个匿名联合组成,我相信文档希望简化这个假设,让读者更容易理解。