【发布时间】:2020-03-25 18:01:36
【问题描述】:
您有 2 个类 Cats 和 Dogs,需要创建一个共享指针向量来存储这 2 个类的数据。提示:多态性并记住类可以有相似的字段。
这就是我到目前为止所做的。我想在 shared_ptr vector 中插入 Cats 和 Dogs 类的所有信息,但我不知道如何。我只设法在vector 中插入来自基类的数据。
#include <iostream>
#include <vector>
#include <memory>
class Animal
{
protected:
int tip;
std::string name;
int age;
public:
Animal(int t, std::string n, int a): tip(t), name(n), age(a) {}
friend std::ostream& operator<<(std::ostream& os, const Animal& a)
{
os << "Name: " << a.name << std::endl;
os << "Age: " << a.age << std::endl;
return os;
}
};
class Cats: public Animal
{
std::string race;
std::string pref_food;
public:
Cats(int t = 0, std::string n = "", int a = 0, std::string r = "", std::string mnprf = ""):
Animal(t, n, a), race(r), pref_food(mnprf) {}
friend std::ostream& operator<<(std::ostream& os, const Cats& c)
{
// auto n = static_cast<Animal> (c);
os << "Name: " << c.name << std::endl;
os << "Age: " << c.age << std::endl;
os << "race: " << c.race << std::endl;
os << "Fav food: " << c.pref_food << std::endl;
return os;
}
};
class Dog: public Animal
{
std::string disease;
std::string master;
public:
Dog(int t = 1, std::string n = "", int a = 0, std::string b = "", std::string s = "" ):
Animal(t, n, a), disease(b), master(s) {}
friend std::ostream& operator<<(std::ostream& os, const Dog& d)
{
os << "Name: " << d.name << std::endl;
os << "Age: " << d.age << std::endl;
os << "disease: " << d.disease << std::endl;
os << "master: " << d.master << std::endl;
return os;
}
};
template<typename T>
void add(std::vector<std::shared_ptr<Animal>>& vec, const T& a)
{
auto newptr = std::make_shared<Animal>(a);
vec.push_back(newptr);
}
int main()
{
std::vector<std::shared_ptr<Animal>> Animals;
Dog d(1,"Rex", 12, "idk", "Oscar");
Cats c(0,"Meaw", 11, "Sfinx", "Catfood");
add(Animals,d);
add(Animals,c);
for(auto i: Animals)
{
std::cout << *i;
}
}
【问题讨论】:
-
记住你学到的关于多态性的知识......不清楚为什么你首先在堆栈上创建
Dog d(...)和Cats c(...),然后复制它们来构造智能指针。从一开始就使用shared_ptr -
将
std::make_shared<Animal>更改为std::make_shared<T>将是一个好的开始 -
你为什么要创建这么多对象并通过
add函数绕道而行?你不需要比Animals.push_back(std::make_shared<Dog>(1,"Rex", 12, "idk", "Oscar");更复杂的东西。如果确实需要add,那么要复制的对象的类型是T,而不是Animal。 -
如果您要存储指向诸如
Animal之类的基类的指针,该类应该有一个虚拟析构函数。
标签: c++ vector shared-ptr insertion