从基类对象的向量中移除匹配特定类的对象
Removing object from vector of base-class objects if matches specific class
我创建了一个简单的类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中删除特定对象。我重载了操作符——我希望它以某种动物派生类作为参数,并从vector中删除该类的第一次出现:假设vector包含Dog, Cat, Dog——然后在调用了herd-Cat之后,我希望它是Dog, Dog。为此,我将遍历vector并查找与arg对象匹配的元素。
不幸的是,在传递Cat作为参数后,我的类将其视为动物类型,因此无论我传递给函数什么,第一个元素总是被删除。
我试图通过创建指针的向量来实现这一点,而不是对象,但是我的整个程序覆盖了错误,我不知道如何修复这些错误以使整个程序工作。
在这种情况下,您将体验对象切片。为了使它工作,你必须使用指针。但是,将std::shared_ptr
或std::unique_ptr
存储在vector中而不是原始指针中是个好主意,因为在这种情况下,您不必自己释放内存。
最后,检查确切的类型,你可以尝试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
}
}
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 为什么此派生对象无法访问基类的后递减方法?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 获取我的基类以递增派生类对象整数
- 按基类对象访问派生类资源时出错
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 将派生类的对象传递给基类
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- C++ 构造函数传递对基类对象的引用
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 使用基类对象访问派生的仅类方法
- 如何在 c++ 中通过基类引用访问派生类的对象?
- 在基类中创建派生类的对象
- C++:如何将对象作为模板基类传递给函数
- 如何删除派生类中基类对象的新对象
- 使用基类对象调用Dervied Class函数
- 通过指向派生对象基类的指针删除派生对象