如果匹配特定类,则从基类对象的向量中移除对象

时间:2016-11-16 09:19:20

标签: c++ oop vector

我创建了一个简单的类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类型,因此无论我传递给函数,第一个元素总是被删除。

我尝试通过制作一个指针向量来实现这一点,而不是对象但是我的整个程序再次覆盖了错误,我不知道如何修复以使整个过程发挥作用。

1 个答案:

答案 0 :(得分:3)

在这种情况下,您将体验object slicing。为了使它工作,你将不得不使用指针。但是,将std::shared_ptrstd::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
    }
}