0

オブジェクトへのポインタの配列を介してbjectメソッドにアクセスする方法を理解するのに問題があります。

私はEnvironmentクラスのenvオブジェクトを持っています:

Environment env;

私の環境には、いくつかのオブジェクトポインターと、ポインターの動的配列があります。

    static Robot *robot;
    static Obstacle *obstacle;
    static Object **objects;

したがって、オブジェクトの内部には、ロボットや障害物を配置できます。

しかし、 objects配列内のオブジェクトのメソッドにアクセスしたい場合、どうすればよいですか?私は試した

    Environment env;
    Robot *robot;

    robot = env.objects[0];
    robot->setSpeed(175);

しかし、それはうまくいきませんでした。エラーが発生しました:

error: invalid conversion from ‘Object*’ to ‘Robot*’

私は何が間違っているのですか?

PS:ロボットはオブジェクトから継承します。

前もって感謝します!

4

6 に答える 6

4

からRobot継承するため、またはをObject使用してポインタをキャストする必要があります。static_castdynamic_cast

robot = static_cast<Robot*>(Environment::objects[0]);

ちなみに、配列の代わりに、生のポインタの代わりにのstd::vectorようなスマートポインタを使用することもお勧めします。std::shared_ptr

于 2012-11-03T20:08:05.960 に答える
2

Object*をRobot*にキャストする必要があります。RobotがObjectから継承すると仮定します。dynamic_castを使用することをお勧めします。

Robot* robot = dynamic_cast<Robot*>(env.objects[0]);
if (robot != NULL) {
    robot->setSpeed(14);
}
于 2012-11-03T20:06:06.973 に答える
1

基本クラスのポインタを派生クラスのポインタに暗黙的に割り当てることはできません。これを行う必要がある場合は、を使用してくださいdynamic_cast

于 2012-11-03T20:08:28.813 に答える
1

オブジェクトはObject**型で宣言されています。これは、objects[0]がObject*型であることを意味します。オブジェクト*をロボット*に割り当てることはできません。RobotがObjectから派生したクラスであり、少なくとも1つの仮想メンバー関数を持っていると仮定すると、次のことができます。

robot = dynamic_cast<Robot*>(object[0]);

これにより、キャストが実行されるか、object [0]がRobotでない場合は、robotがnullポインタ値に設定されます。ロボットであることが確実にわかっている場合は、代わりにstatic_cast()を使用できます。

于 2012-11-03T20:09:09.750 に答える
1

オブジェクトをObject*からRobot*にキャストする必要があります。ただし、それがRobotオブジェクトであることを確認する必要があります。そうしないと、アプリケーションがクラッシュします。

次に例を示します。

#include <iostream>
class Object
{
};

class Robot : public Object
{
  public:
  int speed;
  void setSpeed(int newSpeed){ speed = newSpeed; }
};

int main()
{
  Object* obj = new Robot();
  ((Robot*)obj)->setSpeed(4);
  std::cout << "Speed is: " << ((Robot*)obj)->speed << std::endl;
}
于 2012-11-03T20:04:47.170 に答える
0

オブジェクトはRobot*またはそのサブクラスへのポインタではないようです。

于 2012-11-03T20:05:49.390 に答える