我正在尝试表示对象的二维 map 。所以我有一个“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;
...
}
然后当我想知道 map 中某个位置的内容时,我会这样做:
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 {
...
}
我还没有实际尝试过,但我认为这是可能的。我真正想问的是这是一个好的设计模式吗?或者有更好的方法吗?
最佳答案
“打开类型”通常表示存在设计问题。
您通常想要做的是为您关心的行为定义和实现一些虚函数。例如,您可能关心飞入其中一个空间。如果是这样,您可能有一个功能来查看它是否允许进入。如果无人机试图飞向露天,它将返回 true
,如果它试图飞入树中,则返回 false。
顺便说一句,如果您要派生对象,则需要将数组定义为容器指针,而不是基类的实际对象。否则,当您尝试将派生对象放入数组时,它会被“切片”成为基类的对象。
关于c++ - 在运行时根据实例变量转换对象 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893843/