c++ - 设计问题 - 多重继承,C++

标签 c++ visual-c++ inheritance multiple-inheritance

首先我将展示一些代码,然后对问题进行描述:

class CGUIObject
{
protected:
    int m_id;
    bool m_bVisible;

    // Other non-relevant fields and methods specific for gui object...
};

class CClickable
{
private:
    bool m_bClicked;
public:
    bool isClicked();
    void setClicked(bool bClicked);

    virtual bool wasClicked(const TPoint& clickPos) = 0;

    // Other non-relevant fields and methods specific for clickable object...
};

class CComponent : public CGUIObject
{
    // The only important part of this class is that it derives from CGUIObject
};    

class CButton : public CComponent, CClickable
{
    // The only important part of this class is that it derives from CComponent and CClickable
};

// Now there is a method in my EventManager which informs all clickables about left mouse click event
void CEventManager::lMouseButtonClickEvent(const CPoint& clickPos)
{
    // Go through all clickables
    for(unsigned int i = 0; i < m_clickableObjectsList.size(); i++)
    {
         TClickable* obj = m_clickableObjectsList[i];

         // Here I would like to also check if obj is visible
         if(obj->wasClicked(clickPos))
         {
          obj->setClicked(true);
          if(obj->m_pOnClickListener != nullptr)
               obj->m_pOnClickListener->onClick();
         return; // Only one object can be clicked at once
         }
    }
}

好的,正如您所看到的:

  • CButton 派生自 CComponent 和 CClickable
  • CComponent 派生自 CGUIObject
  • CGUIObject 有 m_bVisible 字段,这对我来说很重要
  • 在 EventManager 中,我创建了 CClickable* 对象的列表

现在我想通知被单击的特定 CClickable 对象,但仅当它可见时。我知道所有可点击对象也都派生自 CGUIObject(例如 CButton),但它是 CClickable* 列表,因此可以理解我无法访问 m_bVisible 字段。我知道这只是表明我在设计中犯了一个错误,但是有没有办法以某种优雅而简单的方式解决这个问题?

最佳答案

如果您知道所有可点击对象均派生自CGUIObject,则可以使用dynamic_cast:

CClickable* obj = m_clickableObjectsList[i];

// Here I would like to also check if obj is visible
if(obj->wasClicked(clickPos) && dynamic_cast<CGUIObject*>(obj)->m_bVisible)
{
  //...

如果可点击对象不是 GUI 对象,在这种情况下,dynamic_cast 将返回空指针,您应该在取消引用结果之前检查这一点。

关于c++ - 设计问题 - 多重继承,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627531/

相关文章:

c++ - 用于处理文件路径的 Qt 类

c++ - 如何移动计算出的圆的位置?

c++ - 多重继承和指针实现

c++ - CUDA 编译错误 : __hmul and __hneg are undefined

java - 在另一个类中使用来自扩展类的局部变量字符串

c++ - 在基类上自动推断派生类上函数的返回类型

c++ - 修复没有安装 VS Redistributables 的 MFC 应用程序中的并排配置错误

c++ - VC++ "Exclude Directories"项目设置实际上是做什么的?

css - 在 CSS 中使用对象引用

java - 扩展多个类