2017-06-03 12 views
-2

私は「ロボット」というベクトルを持っています。 QuickLimitedRobotという名前の別のObjectがあります。これはRobotから継承されていますが、もう1つのフィールドがあります。これは整数です。父のオブジェクトベクトルから子オブジェクトgetter関数に到達する方法

私は、制限されているかどうか、または他の継承されたタイプのロボットオブジェクトであるかどうかにかかわらず、すべてのロボットを含むベクターを持っており、私のコード上のgetLimit()それがQuickLimitedRobotであることを知っている。私は「非スカラー型」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(); 

誰かが私を解決に導くことができますか?

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(); 

それとも、あなたは本当にそれがQuickLimitedRobotだし、継承は仮想ではない100%絶対確実なら、あなたもstatic_castを試すことができます。今回は間違っている場合、結果の参照を使用することは未定義の動作です。運が良ければクラッシュします。

QuickLimitedRobot& tempQuick = static_cast<QuickLimitedRobot&>(*robots[rNum]); 
int rLim = tempQuick.getLimit(); 
関連する問題