Несколько типов в одном векторе c ++

Интересно, смогу ли я хранить разные типы не родных данных в одном векторе?
это выглядит так:

class foo
{
private:
int x;
public:
foo(int a=0):x(a){}
int getx() { return x; }
void setx(int a=0) { x=a; }
};
class var:public foo
{
private:
int y;
public:
var(int a=0, int b=0):foo(a), y(b){}
int gety() { return y; }
void sety(int a=0) { y=a; }
};
class var1:public foo
{
private:
int z;
public:
var(int a=0, int b=0):foo(a), z(b){}
int getz() { return z; }
void setz(int a=0) { z=a; }
};

Как объявить вектор для хранения данных обоих var а также var1 типы?
Я мог бы хранить их в std::vector<foo>, но тогда они будут рассматриваться как если бы они foo типы

0

Решение

Если вы добавите подтип foo к std::vector<foo>, вы потеряете информацию подтипа. Увидеть Что такое нарезка объектов? для получения дополнительной информации.

std::vector<foo> контейнер может содержать только объекты типа foo, Чтобы иметь возможность хранить объекты, полученные из foo, вам придется размещать объекты в куче и хранить указатели в vector указателей, предпочтительно vector умных указателей — std::vector<std::shared_ptr<foo>> или же std::vector<std::unique_ptr<foo>>,

3

Другие решения

Вы можете использовать полиморфизм. Так что вместо того, чтобы объявить std::vector<foo>Вы объявляете указатель базового класса: std::vector<foo*>,

Тогда в вашей функции вы можете объявить как

vector<foo*> bar;

bar.push_back( new var1() );
1

По вопросам рекламы [email protected]