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

标签 c++ design-patterns

我正在尝试表示对象的二维 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/

相关文章:

c++ - 用什么样的流打开二进制文件呢?

c++ - 将类对象指针传递给用于初始化 C++ 的函数

c# - ASP.NET Core,运行时如何推理启动类?

java - 使用 Spring 进行运行时依赖注入(inject)

c++ - 在构造函数上传递参数或在每个方法上传递它们

c++ - 如何在 Omnet++ 中将 cQueue 实现为优先级队列?

c++ - 为什么我的 ".find"函数给我错误的值?

ios - Swift:除了单例,还有什么其他方式来存储 currentUser?

swift - 使用依赖注入(inject)和可达性(互联网检查)类?

c++ - 为什么会发生内存访问冲突?