【问题标题】:Removing object from vector of base-class objects if matches specific class如果匹配特定类,则从基类对象的向量中删除对象
【发布时间】:2017-03-30 10:00:09
【问题描述】:

我创建了一个简单的类 Animal,它是几个不同动物的基类。然后我创建了另一个名为 Herd 的类,它将 Animal 类型的对象存储在 vector 中,并保存了一些对这些对象进行操作的方法。

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 中删除特定对象。我重载了运算符-并且我希望它采用一些动物派生类作为参数并从向量中删除该类的第一次出现:假设向量包含 Dog、Cat、Dog-然后在调用 herd-Cat 之后我希望它是 Dog , 狗。我会通过遍历我的向量并找到与 arg 对象匹配的元素来做到这一点。

不幸的是,在传递 Cat 作为参数后,我的类将它视为 Animal 类型,所以无论我传递给函数什么,第一个元素总是被删除。

我试图通过创建一个指针向量而不是对象来实现这一点,但是我的整个程序再次覆盖了错误,我不知道如何修复这些错误以使整个事情正常工作。

【问题讨论】:

  • 在您的向量中,所有项目都属于大多数派生类Animal。要具有多态性,一个更异构的向量,您可以使用指针向量。 vector&lt;shared_ptr&lt;Animal&gt;&gt; 是一种合理的选择。
  • 你会想读这个:What is Object Slicing ?
  • 您的代码存在对象切片问题。

标签: c++ oop vector


【解决方案1】:

在这种情况下,您将体验到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
    }
}

【讨论】:

  • 如果你有一个 (norwegian forest cat)
  • @Lanting,是的,这是真的,但是它仍然适用于 OP,例如“为所有猫做点什么”或“为所有挪威森林猫做点什么(它们是神奇的动物, btw)”,这似乎正是 OP 想要做的。
  • 我不熟悉智能指针。如果我有这样的向量,那么为什么我不能有这样的方法:void operator+=(Animal *arg) { vec.push_back(arg); }
  • @IFeel3,你可以,如果你想让多态性工作,你只需要指针,不管它们是智能指针还是原始指针。
  • @SingerOfTheFall 你能告诉我是否应该知道一些关于处理这个向量的破坏的事情吗?我按照你告诉我的那样编写了这段代码,它似乎可以处理一个异常——在我的代码到达 Herd 的析构函数后,它会抛出 thisHere's the code
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多