C++ 如果匹配特定类,则从基类对象的向量中移除对象
我创建了一个简单的类Animal,它是一些不同动物的基类。然后,我创建了另一个名为Herd的类,它将动物类型的对象存储在vector中,并包含一些对这些对象进行操作的方法C++ 如果匹配特定类,则从基类对象的向量中移除对象,c++,oop,vector,C++,Oop,Vector,我创建了一个简单的类Animal,它是一些不同动物的基类。然后,我创建了另一个名为Herd的类,它将动物类型的对象存储在vector中,并包含一些对这些对象进行操作的方法 class Herd { public: Herd() {} ~Herd() {} Herd operator+(Animal arg) { vec.push_back(arg); return *this; } void operator+=(Animal arg) { vec.push_bac
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;
};
类群{
公众:
羊群(){}
~Herd(){}
畜群操作员+(动物参数){
向量推回(arg);
归还*这个;
}
无效运算符+=(动物参数){
向量推回(arg);
}
畜群操作员-(动物arg){
std::vector::iterator position=std::find(vec.begin(),vec.end(),arg);
if(position!=vec.end())/==myVector.end()表示找不到元素
矢量擦除(位置);
归还*这个;
}
void make_noise(){
向量::迭代器v=vec.begin();
while(v!=vec.end()){
v->发出声音();
v++;
}
cout在这种情况下,您将体验到。为了使其工作,您必须使用指针。但是,最好将std::shared_ptr
或std::unique_ptr
存储在向量中,而不是原始指针,因为在这种情况下,您不必自己释放内存
最后,要检查确切的类型,您可以尝试对指针进行dynamic\u 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
}
}
vec;
用于(自动动物:vec)
{
if(动态施法(animal.get())
{
//猫
}
如果(类型ID(*动物)=类型ID(猫))
{
//也是一只猫
}
}
这可能会对你有所帮助:在你的向量中,所有的项都是最派生的类动物
。要拥有多态性,一个更异质的向量,你可以使用指针向量。向量
是一个合理的选择。你需要阅读以下内容:你的代码受到对象切片的影响。你的方法有一点不同h例如,如果你有一只(挪威森林猫)@Lanting,是的,这是真的,但在“为所有猫做点什么”或“为所有挪威森林猫做点什么”(顺便说一句,它们是神奇的动物)的情况下,它仍然适用于OP,这似乎正是OP想要做的。我不熟悉智能指针。如果我有这样的向量,为什么我不能有这样一个方法:void操作符+=(Animal*arg){vec.push_back(arg);}
?@IFeel3,你可以,如果你想让多态性工作,你只需要指针,不管它们是智能指针还是原始指针。@Singerofall你能告诉我我是否应该知道如何处理这个向量的破坏吗?我按照你说的写了这段代码,它似乎在一个例外情况下工作-在我的代码到达它抛出的群的析构函数。