有没有办法用父 类 namespace/classspace 来引用子 类?
Is there a way to refer to child classes with the parent classes namespace/classspace?
假设我有以下 Mouse Event
class 和 Button
事件并扩展 Button Press
和 Button Release
事件:
namespace Event {
namespace Mouse {
class Button : public Event {
public:
inline Input::Code::Mouse get_mouse_button() const {
return m_Button;
}
EVENT_CLASS_CATEGORY(Event_Category_Input | Event_Category_Mouse)
protected:
Button(Input::Code::Mouse button)
: m_Button(button) {}
Input::Code::Mouse m_Button;
};
class Press : public Button {
public:
Press(Input::Code::Mouse button) : Button(button) {}
std::string to_string() const override {
return fmt::format("Mouse Button Press: {0}", m_Button);
}
EVENT_CLASS_TYPE(Mouse_Button_Press)
};
class Release : public Button {
public:
Release(Input::Code::Mouse button)
: Button(button) {}
std::string to_string() const override {
return fmt::format("Mouse Button Release: ", m_Button);
}
EVENT_CLASS_TYPE(Mouse_Button_Release)
};
}
}
我想用 Event::Mouse::Button::Press
和 Event::Mouse::Button::Release
代替 Event::Mouse::Press
和 Event::Mouse::Release
来引用它们。我不能直接添加 namespace Button
来强制执行此行为,因为它会与已经定义的 Button
class 冲突。有没有办法做到这一点?我知道我可以分别将其命名为 Button_Press
和 Button_Release
,但出于文体原因我不想这样做。提前致谢!如果不可能,我就接受并使用下划线。
由于您希望 Press
和 Release
在名称上成为 Event::Mouse::Button
的一部分,我将在定义上将它们作为 Event::Mouse::Button
的一部分。这里唯一的技巧是 Press
和 Release
的定义不能在 Button
的定义内(但它们的声明必须仍然存在)。
namespace Event {
namespace Mouse {
class Button : public Event {
class Press; // <-- declare here
class Release;
};
// End of class Button
// Begin definition of Button::Press
class Button::Press : public Button {
};
// Begin definition of Button::Release
class Button::Release : public Button {
};
}
}
(请注意我是如何从您的示例中删除不必要的和分散注意力的混乱内容的。这也使示例更加完整,只缺少 Button
扩展的 Event
class 的定义.)
是的,你可以这样做。
转发在您的 Button
class 中声明这些类型。
这为类型提供了您想要的范围。
class Button : public Event {
public:
class Press;
class Release;
};
然后,您可以在 class 之外定义它们。
您必须在 class 之外定义它们,因此父 class Button
已完全定义。
class Button::Press : public Button {
public:
};
class Button::Release : public Button {
public:
};
假设我有以下 Mouse Event
class 和 Button
事件并扩展 Button Press
和 Button Release
事件:
namespace Event {
namespace Mouse {
class Button : public Event {
public:
inline Input::Code::Mouse get_mouse_button() const {
return m_Button;
}
EVENT_CLASS_CATEGORY(Event_Category_Input | Event_Category_Mouse)
protected:
Button(Input::Code::Mouse button)
: m_Button(button) {}
Input::Code::Mouse m_Button;
};
class Press : public Button {
public:
Press(Input::Code::Mouse button) : Button(button) {}
std::string to_string() const override {
return fmt::format("Mouse Button Press: {0}", m_Button);
}
EVENT_CLASS_TYPE(Mouse_Button_Press)
};
class Release : public Button {
public:
Release(Input::Code::Mouse button)
: Button(button) {}
std::string to_string() const override {
return fmt::format("Mouse Button Release: ", m_Button);
}
EVENT_CLASS_TYPE(Mouse_Button_Release)
};
}
}
我想用 Event::Mouse::Button::Press
和 Event::Mouse::Button::Release
代替 Event::Mouse::Press
和 Event::Mouse::Release
来引用它们。我不能直接添加 namespace Button
来强制执行此行为,因为它会与已经定义的 Button
class 冲突。有没有办法做到这一点?我知道我可以分别将其命名为 Button_Press
和 Button_Release
,但出于文体原因我不想这样做。提前致谢!如果不可能,我就接受并使用下划线。
由于您希望 Press
和 Release
在名称上成为 Event::Mouse::Button
的一部分,我将在定义上将它们作为 Event::Mouse::Button
的一部分。这里唯一的技巧是 Press
和 Release
的定义不能在 Button
的定义内(但它们的声明必须仍然存在)。
namespace Event {
namespace Mouse {
class Button : public Event {
class Press; // <-- declare here
class Release;
};
// End of class Button
// Begin definition of Button::Press
class Button::Press : public Button {
};
// Begin definition of Button::Release
class Button::Release : public Button {
};
}
}
(请注意我是如何从您的示例中删除不必要的和分散注意力的混乱内容的。这也使示例更加完整,只缺少 Button
扩展的 Event
class 的定义.)
是的,你可以这样做。
转发在您的 Button
class 中声明这些类型。
这为类型提供了您想要的范围。
class Button : public Event {
public:
class Press;
class Release;
};
然后,您可以在 class 之外定义它们。
您必须在 class 之外定义它们,因此父 class Button
已完全定义。
class Button::Press : public Button {
public:
};
class Button::Release : public Button {
public:
};