【发布时间】: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<shared_ptr<Animal>>是一种合理的选择。 -
你会想读这个:What is Object Slicing ?
-
您的代码存在对象切片问题。