我有2个类:hObject,Drawer。抽屉继承自hObject。
使用此代码我通过id:
来检索特定对象hObject * foundObj = hManager::getInstance()->getObject("drawer_id");
现在我想正确地将foundObj从hObject转换为Drawer。用:
vector<int> points = ((DrawerWidget *)hObject)->getPoints();
我重温
在')'令牌之前预期的主要表达
那么动态演员呢?
考虑:我的技能已经减半,直到我开始使用c ++
答案 0 :(得分:3)
两个问题:
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
}
虽然如果你发现自己这样做,我会考虑设计:重新设计基类以支持你想通过虚函数做什么,或者在编译时确保转换可能更合适是有效的。
答案 1 :(得分:3)
你不小心写了指针的类型,而不是名字:
vector<int> points = ((DrawerWidget *)hObject)->getPoints();
// ^^^^^^^
你的意思是:
vector<int> points = ((DrawerWidget *)foundObj)->getPoints();
// ^^^^^^^^
此外,为了获得巨大的胜利,更喜欢C ++风格的演员:
vector<int> points = (static_cast<DrawerWidget*>(foundObj))->getPoints();
最后,如果*foundObj
可能实际 DrawerWidget
,并且这些类型是多态的,请考虑 not 强制转换而是依靠虚拟调度。