C ++通过指向对象的指针数组访问对象方法

时间:2012-11-03 20:00:30

标签: c++

我无法通过指向对象的数组来确定如何访问bject方法。

我有一个Environment类的 env 对象:

Environment env;

我的环境有一些对象指针以及一个动态的指针数组:

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

所以在对象里面我可以有机器人和障碍物:

但是现在当我想访问对象数组中的对象方法时,我该怎么做?我试过了

    Environment env;
    Robot *robot;

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

但它没有用。我收到了一个错误:

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

我做错了什么?

PS:机器人继承自Object。

提前谢谢!

6 个答案:

答案 0 :(得分:4)

由于Robot继承自Object,您必须使用static_castdynamic_cast来投射指针:

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

作为旁注,我还建议您使用std::vector代替数组,使用智能指针std::shared_ptr而不是原始指针。

答案 1 :(得分:2)

您需要将Object *转换为Robot *。假设Robot继承自Object。我建议你使用dynamic_cast:

Robot* robot = dynamic_cast<Robot*>(env.objects[0]);
if (robot != NULL) {
    robot->setSpeed(14);
}

答案 2 :(得分: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;
}

答案 3 :(得分:1)

您不能隐式地将基类的指针指定给派生类的指针。如果您需要这样做,请使用dynamic_cast

答案 4 :(得分:1)

使用Object **类型声明

objects ,这意味着objects [0]的类型为Object *。您无法将对象*分配给Robot *。假设Robot是一个派生自Object的类,至少有一个虚拟成员函数,你可以做

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

如果object [0]碰巧不是Robot,则执行转换或将 robot 设置为空指针值。如果你确定它是一个机器人,你可以改用static_cast()。

答案 5 :(得分:0)

你的对象似乎不是Robot *或指向它的子类的指针。