【问题标题】:Is there a way to refer to child classes with the parent classes namespace/classspace?有没有办法用父类命名空间/类空间来引用子类?
【发布时间】:2021-05-10 06:10:08
【问题描述】:

假设我有以下 Mouse Event 类,其中包含 Button 事件并扩展了 Button PressButton 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::PressEvent::Mouse::Button::Release 而不是Event::Mouse::PressEvent::Mouse::Release 来引用这些。我不能直接添加 namespace Button 来强制执行此行为,因为它会与已定义的 Button 类冲突。有没有办法做到这一点?我知道我可以分别将其命名为 Button_PressButton_Release,但出于文体原因,我不想这样做。提前致谢!如果不可能,我就收拾一下,用下划线。

【问题讨论】:

  • 你能编辑Button类吗?
  • 好的,你建议用什么方式?
  • 如果我基本上同时得到两个相同的答案,我接受哪个答案?
  • 时间无关紧要。尽你最大的努力去接受你认为最好的答案。这里没有难过的感觉。

标签: c++ class inheritance namespaces c++20


【解决方案1】:

是的,你可以这样做。

Button 类中转发声明这些类型。

这为类型提供了您想要的范围。

class Button : public Event {
  public:

    class Press;
    class Release;        

};

然后,你可以在类之外定义它们。

必须在类外定义,这样父类Button就完全定义好了。

class Button::Press : public Button {
public:

};

class Button::Release : public Button {
public:

};

【讨论】:

  • 太棒了!这比我想象的要直观得多,哎呀!这对性能有任何影响吗?
  • 影响类型的范围,对性能没有影响
【解决方案2】:

由于您希望 PressRelease 在名称上成为 Event::Mouse::Button 的一部分,因此我将它们定义为 Event::Mouse::Button 的一部分。这里唯一的技巧是PressRelease 的定义不能在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 类的定义。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多