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中,我创建了可单击*对象的列表
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.:-)谢谢,这似乎是一个更好的主意