创建不同对象的数组

时间:2012-09-22 09:17:34

标签: c++ inheritance casting

这是我上一个问题的后续内容,其中我需要一个对象数组,这些对象是一个基类的子类。有人建议我尝试使用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. Car 8引用索引值为3的自行车。
  2. 没有dynamic_casting还有其他解决方法吗?

    编辑:如果我用一堆子类填充数组,我怎么能在特定索引处访问子类的数据。换句话说,假设一辆自行车在索引8处。我怎样才能从该对象获得带有数组和索引的int响铃。

4 个答案:

答案 0 :(得分:1)

这取决于你正在做什么,但你可以有一个存储枚举的结构数组,它指定它与对象指针一起存储的对象类型。

IE:

class CObject;

enum EObjectType
{
    OT_Bike,
    OT_Car
};

struct SObjectInfo
{
    EObjectType Type;
    CObject* Object;
};

迭代数组时,可以检查对象的类型,然后 static 将对象指针强制转换为相应的派生类型。我在无法避免的情况下广泛使用这种方法,并且在通用容器中绝对需要运行时识别对象类型。

为什么不使用多态和虚方法,需要在同一个数组中存储不同类的对象?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

对我来说,这里最好的想法是使用纯虚拟方法的接口。像:

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

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

答案 3 :(得分:0)

看起来您的问题需要一些运行时开销,无论实现方式如何:这是因为在某些时候程序需要决定它实际存储的类型。请注意,除了使用Boost:

之外,您还可以选择引入一点人工继承