创建不同对象的数组

Creating an array of unlike objects

本文关键字:数组 对象 创建      更新时间:2023-10-16

这是我最后一个问题的后续问题,其中我需要一组对象,这些对象是一个基类的子类。有人建议我尝试dynamic_cast但速度在这个项目中非常重要。

这基本上是我所追求的。

class Object
{
protected:
    int id;
};
class Bike: public Object
{
public:
    bike();
private:
    int bells;
};
class Car: public Object
{
public:
    void drive();
private:
    int wheels;
};

我需要这些对象的数组,所以我决定使用基类。

// Imagine I have 10 objects and don't know what they will be
Object* objects[10];
// Let's make the first object
objects[0] = new Car;

有人告诉我动态选角是个好主意。问题是速度很重要,我有一些实例需要执行以下操作:

  1. 汽车 8 引用索引值为 3 的自行车。

没有dynamic_casting还有其他解决方法吗?

编辑:如果我用一堆子类填充数组,我如何在特定索引处访问子类的数据。换句话说,假设一辆自行车位于索引 8。我怎么能只用数组和索引从那个对象中获取 int 钟。

这取决于您正在执行的其他操作,但您可以有一个结构数组来存储枚举,该枚举指定它存储的对象类型以及对象指针。

即:

class CObject;
enum EObjectType
{
    OT_Bike,
    OT_Car
};
struct SObjectInfo
{
    EObjectType Type;
    CObject* Object;
};

循环访问数组时,可以检查对象的类型,然后将对象指针静态强制转换为相应的派生类型。我在无法避免的地方广泛使用此方法,并且在通用容器中绝对需要对象类型的运行时标识。

但是,为什么需要在不使用多态性和虚拟方法的情况下将不同类的对象存储在同一个数组中?

首先,

如果您需要它非常快,请不要使用运算符 new 在堆上创建它。如果可能,您需要在本地创建它们。

如果您确定总会有您的对象,则可以将转换更改为static_cast这是一个更快的解决方案。

对我来说,这里最好的主意是将接口与纯虚拟方法一起使用。 比如:

Class Objects //interface
{
public:
   virtual void ride() = 0;
}

然后使用接口作为基类。这在编程中很常见。

如果对象不像,为什么有一个基类?此链接可能会有所帮助: http://www.codeproject.com/Articles/23304/High-Performance-Heterogeneous-Container

看起来你的问题需要一些运行时开销,无论实现看起来如何:这是因为在某些时候程序需要决定它实际存储的类型。请注意,除了引入一点人工继承之外,您还有更多选择,前提是您能够负担得起使用 Boost:

  • Boost.Variant - 如果您知道将提前存储的所有类型
  • Boost.Any - 如果你不这样做