2017-06-03 33 views
-2

我有一个任务,在那里我有一个'机器人'向量 - 我有一个对象。我有另一个Object,命名为QuickLimitedRobot,它从Robot继承,但又有一个字段 - 限制,它是一个整数。如何从父对象向量到达子对象获取器函数

我有一个包含所有的机器人,它们是否被限制或其他遗传类型的机器人对象的矢量,而我需要对我的代码getLimit()函数,在矢量节点,我已经知道这是一个QuickLimitedRobot。

void RobotDB::moveLimitedRobot(const int rNum, const std::string &rDirection){ 
int cellValue; 
int locX=robots[rNum]->getCoordinate().getX(); 
int locY=robots[rNum]->getCoordinate().getY(); 
//@todo: :(
QuickLimitedRobot tempQuick=*robots[rNum]; 
int rLim=tempQuick.getLimit(); 

我的编译器不会编译这个,因为我试图将Robot转换为'非标量类型'QuickLimitedRobot。

有人可以请我带领一个解决方案?

thx提前!

+0

能否请您提供一个[MCVE]再现您的问题。 –

+1

向下转换必须是明确的,使用'dynamic_cast'或'static_cast' – UnholySheep

回答

1

您可以使用dynamic_cast。这看起来像:

QuickLimitedRobot* tempQuick = dynamic_cast<QuickLimitedRobot*>(robots[rNum]); 
if (tempQuick) { 
    int rLim = tempQuick->getLimit(); 

或者因为你说你已经知道这是一个QuickLimitedRobot,您可以参考投。如果你弄错了,它会抛出异常。

QuickLimitedRobot& tempQuick = dynamic_cast<QuickLimitedRobot&>(*robots[rNum]); 
int rLim = tempQuick.getLimit(); 

或者,如果你真的100%绝对肯定这是一个QuickLimitedRobot和继承不是虚拟的,你甚至可以尝试static_cast。这一次,如果你弄错了,那么使用最终的参考是未定义的行为 - 如果你幸运的话会崩溃。

QuickLimitedRobot& tempQuick = static_cast<QuickLimitedRobot&>(*robots[rNum]); 
int rLim = tempQuick.getLimit();