创建不同对象的数组
Creating an array of unlike objects
这是我最后一个问题的后续问题,其中我需要一组对象,这些对象是一个基类的子类。有人建议我尝试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;
有人告诉我动态选角是个好主意。问题是速度很重要,我有一些实例需要执行以下操作:
- 汽车 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 - 如果你不这样做
- 销毁C++中动态分配的内存(数组对象)
- 数组对象的生存期是否在重用其元素存储时结束?
- 为什么顶点数组对象会导致错误?
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- OpenGL 顶点数组对象与 tinyobjloader
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- C++ RapidJson 帮助反序列化数组对象
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 检查成员函数是否返回临时对象或数组对象
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- C++17 std::shared_ptr<> 类数组对象的重载运算符 []
- 添加两个具有运算符重载的数组对象,从而导致分段错误
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 使用相同的数据填充数组对象或使用指针
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- 如何将2d数组对象传递给c++中的函数
- ReferenceTable溢出(jni-android),数组对象释放