我创建了一个简单的类Animal,它是几种不同动物的基类。然后我创建了另一个名为Herd的类,它将Animal类型的对象存储在向量中,并且只保留对这些对象进行操
class Herd {
public:
Herd() {}
~Herd() {}
Herd operator+(Animal arg) {
vec.push_back(arg);
return *this;
}
void operator+=(Animal arg) {
vec.push_back(arg);
}
Herd operator-(Animal arg) {
std::vector<Animal>::iterator position = std::find(vec.begin(), vec.end(), arg);
if (position != vec.end()) // == myVector.end() means the element was not found
vec.erase(position);
return *this;
}
void make_noise() {
vector<Animal>::iterator v = vec.begin();
while (v != vec.end()) {
v->give_sound();
v++;
}
cout << endl;
}
private:
vector<Animal> vec;
};
问题在于从Vector中删除特定对象。我重载了运算符 - 我希望它将一些Animal派生类作为参数并从vector中删除此类的第一次出现:让我们说vector包含Dog,Cat,Dog - 然后在调用herd-Cat之后我希望它是Dog ,狗。我会通过遍历我的向量并找到哪个元素与arg对象匹配来做到这一点。
不幸的是,在将Cat作为参数传递后,我的类将其视为Animal类型,因此无论我传递给函数,第一个元素总是被删除。
我尝试通过制作一个指针向量来实现这一点,而不是对象但是我的整个程序再次覆盖了错误,我不知道如何修复以使整个过程发挥作用。
答案 0 :(得分:3)
在这种情况下,您将体验object slicing。为了使它工作,你将不得不使用指针。但是,将std::shared_ptr
或std::unique_ptr
存储在向量而不是原始指针中是一个好主意,因为在这种情况下,您不必自己释放内存。
最后,要检查确切类型,您可以尝试dynamic_cast
指针,或检查它typeid
。或者,您也可以创建一个多态type()
函数并在每个派生类中覆盖它以返回它的确切类型,但在这种情况下这可能是一种过度杀伤。
vector<shared_ptr<Animal>> vec;
for(auto animal : vec)
{
if(dynamic_cast<Cat*>(animal.get()))
{
//cat
}
if(typeid(*animal) == typeid(Cat))
{
//also a cat
}
}