Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 设计问题-多重继承,C++;_C++_Visual C++_Inheritance_Multiple Inheritance - Fatal编程技术网

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

C++ 设计问题-多重继承,C++;,c++,visual-c++,inheritance,multiple-inheritance,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(); voi

首先,我将介绍一些代码,然后描述一个问题:

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
         }
    }
}
类CGUIObject
{
受保护的:
国际货币基金组织;
布尔m_bVisible;
//其他特定于gui对象的非相关字段和方法。。。
};
类CClickable
{
私人:
布尔穆布克利克;
公众:
bool isClicked();
单击void setClicked(bool bClicked);
单击虚拟对象(const TPoint和clickPos)=0;
//其他与可单击对象特定的非相关字段和方法。。。
};
类CComponent:公共CGUIObject
{
//这个类唯一重要的部分是它派生自CGUIObject
};    
类按钮:公共CComponent,可单击
{
//这个类唯一重要的部分是它派生自CComponent和CClickable
};
//现在,在我的EventManager中有一个方法,用于通知所有可单击项有关鼠标左键单击事件
void CEventManager::lMouseButtonClickeEvent(const CPoint和clickPos)
{
//浏览所有可点击的内容
for(unsigned int i=0;i已单击(单击位置))
{
obj->setClicked(true);
如果(obj->m_pOnClickListener!=nullptr)
obj->m_pOnClickListener->onClick();
return;//一次只能单击一个对象
}
}
}
好的,如你所见:

  • CButton派生自CComponent和CClickable
  • CComponent派生自CGUIObject
  • CGUIObject有
    m_bVisible
    字段,这对我很重要
  • 在EventManager中,我创建了可单击*对象的列表
现在,我想通知被单击的特定可单击对象,但前提是它是可见的。我知道所有可点击的内容也都来自CGUIObject(例如CButton),但它是一个可点击*的列表,所以我无法访问
m_bVisible
字段是可以理解的。我知道这只是表明我在设计上犯了一个错误,但有没有办法以优雅而简单的方式解决这个问题呢

如果您知道所有可单击项都来自
CGUIObject
,则可以使用
dynamic\u 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)
{
  //...
CClickable*obj=m_可点击对象列表[i];
//在这里,我还要检查obj是否可见
如果(obj->wasClicked(clickPos)&&dynamic_cast(obj)->m_bVisible)
{
//...

如果clickable不是GUI对象,则在这种情况下,
dynamic\u cast
将返回一个空指针,您应该在取消引用结果之前对此进行检查。

而不是使用类似于
dynamic\u cast
的东西,您必须在
CButton
中实现
wasClicked
,以说明按钮是否不可见它没有被点击

bool CButton::wasClicked() {
    if(!m_bVisible) return false;
    /*previous logic*/
}

对于线性复杂度,我希望您的应用程序中的可单击对象数量相当少。@MatthieuM。对不起,在这种情况下,您所说的“线性复杂度”是什么意思?您一次遍历所有
可单击的
对象,以检查它们是否可见(并且应该向它们发送事件)或者它们不是(也不需要做任何事情)。因此,这将需要一段时间,至少与可点击的对象的数量成比例,即使只有少数对象是真正需要关注的。谢谢你的回答,Angew.:-)谢谢,这似乎是一个更好的主意