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

时间:2014-09-26 16:08:08

标签: c++ sfml

在阅读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的任何其他成员共享一个内存区域,如定义中明确定义的那样。 / p>

我看到的唯一联合声明是以下内容,再次从类定义中获取:

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)
    };

我是否遗漏了某些内容,或者这只是文档中的真正错误?

1 个答案:

答案 0 :(得分: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

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