在运行时根据实例变量强制转换对象(c++)
Cast Object at Runtime Depending on Instance Variable (C++)
我正在尝试表示对象的二维映射。所以我有一个二维数组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。
顺便说一句,如果要使用派生对象,则需要将数组定义为容器指针,而不是基类的实际对象。否则,当您尝试将派生对象放入数组时,它将被"切片"以成为基类的对象。
相关文章:
- 在 C++ 中将对象转换为派生类型
- Swig无法将python3的字节对象转换为std::string
- 如何将 Python 对象转换为 Cython 扩展类型的 std::vector 并返回?
- 使用 c++ 将 2d CAD 对象转换为 TIFF 格式
- 将对象转换为指向对象的指针?
- 将使用基类 Ctor创建的对象转换为派生类
- C++中的重载歧义,用于自动将对象转换为"printable"格式
- 无法将类对象转换为函数默认参数中的参考
- 无法将对象转换为初始化中的对象*
- 使用提升序列化将类对象转换为矢量无符号字符<>
- 防止在执行时将两个类中的两个对象转换为 bool:if(a!=b)
- 如何在Cython中将Python对象转换为C++类型
- 重载运算符 -- 无法在赋值中将对象转换为基类型
- Cpp:Cpp中的JSON解析器,提供支持序列化/反序列化功能,将JSON对象转换为用户定义的类
- 如何将 'int *' 类型的 swig 对象转换为 ctypes int*
- 将对象转换为 char,然后"uncasting it back"
- 如何在C++中使用boost库将类对象转换为json字符串
- 在 c++ 中使用重载运算符将父对象转换为子对象
- 字符串流 - 将对象转换为字符串
- 将Mat对象转换为双arr(OpenCV)