Динамический массив объектов родительского класса для хранения дочерних объектов
У меня есть Mammal
родительский класс.Dog
, Cat
, Lion
являются подклассами.
Я использую векторы для хранения всех подклассов как Mammal
объект как таковой
vector<Mammal> v;
И используя эту строку, чтобы добавить новые объекты в вектор.
v.push_back(new Dog(Name, Blue, Owner));
Видимо, это не работает. Error no instance of overload function
брошен мне во время компиляции. Я новичок в C++, поэтому я не уверен, что является правильным способом динамического создания массива родительского класса для хранения всех дочерних объектов
2 ответа
Бучиппер уже дал тебе хороший совет. Если вы хотите правильно управлять временем жизни ваших питомцев, подумайте об использовании std::unique_ptr<>
или же std::shared_ptr<>
вместо сырых указателей:
// the vector owns the pets and kills them, when they are removed
// from the vector
vector<std::unique_ptr<Mamal> > v1
// the vector has shared ownership of the pets. It only kills them,
// when noone else needs them any more
vector<std::shared_ptr<Mamal> > v2
// the vector has no ownership of the pets. It never kills them.
vector<Mamal*> v3
В последнем случае кто-то другой должен позаботиться о смерти домашних животных, или они останутся в вашей памяти как зомби. Вы не хотите, чтобы к вашим питомцам, не так ли?
Обновление О, я забыл упомянуть, что вы должны предпочесть make_shared()
а также make_unique()
по новой или использовать emplace_back()
вместо push_back()
v1.emplace_back(new Dog{Name, Blue, Owner});
v1.push_back(make_unique<Dog>(Name, Blue, Owner))
v2.emplace_back(new Dog{Name, Blue, Owner});
v2.push_back(make_shared<Dog>(Name, Blue, Owner))
Как уже упоминалось в комментариях, у вас есть вектор объектов Млекопитающих, а не указатели или ссылки.
Пытаться -
vector <Mammal *> v;
v.push_back(new Dog(Name, Blue, Owner));