在运行时根据实例变量强制转换对象(c++)

Cast Object at Runtime Depending on Instance Variable (C++)

本文关键字:对象 转换 c++ 运行时 实例 变量      更新时间:2023-10-16

我正在尝试表示对象的二维映射。所以我有一个二维数组MapItems:

MapItem* world_map[10][10];

在我的特定情况下,这些MapItem将被用来表示无人机,静态对象(如树木或任何不移动的障碍物),或空位置(这些对象将是MapItem的子类):

class Drone : public MapItem {
  int droneId;
  ...
}
class StaticObject : public MapItem {
  ...
}
class EmptyPosition : public MapItem {
  int amount_of_time_unoccupied;
  ...
}

在MapItem类上有一个实例变量,告诉它是什么特定类型的项目,然后根据它转换为适当的类型,这是一个好主意吗?例如:

enum ItemType = {DRONE, STATIC_OBSTRUCTION, EMPTY};
class MapItem {
  ItemType type;
  ...
}

然后当我想知道地图上某个位置的位置时,我可以这样做:

MapItem *item = world_map[3][3];
if (item->type == DRONE) {
  Drone *drone = dynamic_cast<Drone*>(item);
  // Now do drone specific things with drone
  ...
} else if (item->type == STATIC_OBSTRUCTION) {
  StaticObject *object = dynamic_case<StaticObject*>(item);
  // Static object specific stuff
  ...
} else {
  ...
}

我实际上没有尝试过,但我认为这是可能的。我真正想问的是,这是一个好的设计模式吗?还是有更好的方法?

一个"switch on type"往往表明设计有问题。

你通常想要做的是为你关心的行为定义和实现一些虚函数。例如,您可能关心飞入其中一个空格。如果是这样,您可能有一个函数来检查它是否允许进入。如果无人机试图飞到户外,则返回true,如果它试图飞到树上,则返回false。 顺便说一句,如果要使用派生对象,则需要将数组定义为容器指针,而不是基类的实际对象。否则,当您尝试将派生对象放入数组时,它将被"切片"以成为基类的对象。