不幸的是,我不能使用std::vector
,而必须使用普通的C ++数组。我得到以下代码:
class Base
{
}
class DerivedCar : Base
{
public:
DerivedCar(int a) a(a) {};
private:
int a;
}
class DerivedHouse : Base
{
public:
DerivedHouse(float b) b(b) {};
private:
float b;
}
class Vector
{
Vector() :
index(0)
void add(const DerivedCar& car)
{
vec[index] = new DerivedCar(car.a);
index++;
}
void add(const DerivedHouse& house)
{
vec[index] = new DerivedHouse(house.b);
index++;
}
private:
Vector vec[100];
int index;
}
int main()
{
Vector vector;
DerivedCar car(100);
DerivedHouse house(2.f);
vector.add(car);
vector.add(house);
}
我想拥有一个Base
类型的数组,并添加一个派生类型的对象。
除了我所做的以外,还有其他更好的方法吗?使对象复制最少的最佳方法是什么。
答案 0 :(得分:0)
如何将派生类对象添加到基类类型的数组中?
您不能将派生类对象放入原始数组或基类的std::vector
中,因为派生类对象通常较大,因此根本不适合该类。
是否有比我更好的方法?
肯定有更好的方法。带有多态元素的此类容器的一个很好的示例是boost::base_collection。阅读其文档及其源代码。如果您不了解其中的某些细节,请在Stack Overflow中询问有关该细节的信息。
使对象复制最少的最佳方法是什么。
仅包含指向对象和侵入式容器的指针的容器 保持复制对象最少。但是这种容器不 管理对象,因此对象生命周期的责任 被外面的东西带走。
答案 1 :(得分:0)
这是实现链接列表的一种可能方法:
class Base
{
};
class DerivedCar : public Base
{
public:
DerivedCar(int a) { _a = a; };
private:
int _a;
};
class DerivedHouse : public Base
{
public:
DerivedHouse(float b) { _b = b; };
private:
float _b;
};
class Object
{
public:
const Base *data;
const Object *next;
};
class Vector
{
public:
void add(const Base& v)
{
Object item;
item.data = &v;
head.next = &item;
index++;
}
private:
Object head;
int index = 0;
};
int main()
{
Vector vector;
DerivedCar car(100);
DerivedHouse house(2.f);
vector.add(car);
vector.add(house);
}