SFML 2.1 C ++文档 - sf :: Event真的是一个联盟吗?

问题描述 投票:2回答:1

在阅读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)
    };

我错过了什么,或者只是文档中的真正错误?

c++ sfml
1个回答
0
投票

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

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
}

Example

无论如何,这个类的大部分都是一个匿名联盟,我相信文档想要简化这个假设并让读者容易理解。

© www.soinside.com 2019 - 2024. All rights reserved.