在阅读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)
};
我是否遗漏了某些内容,或者这只是文档中的真正错误?
答案 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
}
无论如何,这个类的大部分都是一个匿名联盟,我相信文档想要简化这个假设,让读者更容易理解。