我有2类:hObject,抽屉。抽屉继承自hObject。

使用此代码,我通过id检索特定对象:

hObject * foundObj = hManager::getInstance()->getObject("drawer_id");


现在我想正确地将foundObj从hObject强制转换为Drawer。与:

vector<int> points = ((DrawerWidget *)hObject)->getPoints();


我复习


  预期在“)”令牌之前的主要表达式


动态演员呢?

考虑:在我开始使用C ++之前,我的技能已减半

最佳答案

两个问题:


您写hObject(类型名称)是指foundObj(对象名称)
它是一个指针,因此您需要转换为指针类型(更新:该问题已被编辑以解决此问题)。


要解决此问题,并使用危险性较小的C ++样式的强制转换,应能进行以下操作:

vector<int> points = (static_cast<DrawerWidget*>(foundObj))->getPoints();



  动态演员呢?


如果基类是多态的(也就是说,至少具有一个虚函数),那将更加安全-您可以在运行时检查强制转换是否有效:

if (DrawerWidget * dw = dynamic_cast<DrawerWidget*>(foundObj)) {
    vector<int> points = dw->getPoints();
} else {
    // not a DrawerWidget
}


尽管如果您这样做,我会考虑一下设计:重新设计基类以通过虚拟函数支持您要执行的操作,或者在编译时确保转换有效,可能更合适。

10-07 23:53