Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果匹配特定类,则从基类对象的向量中移除对象_C++_Oop_Vector - Fatal编程技术网

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

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

我创建了一个简单的类Animal,它是一些不同动物的基类。然后,我创建了另一个名为Herd的类,它将动物类型的对象存储在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;
};
类群{
公众:
羊群(){}
~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你能告诉我我是否应该知道如何处理这个向量的破坏吗?我按照你说的写了这段代码,它似乎在一个例外情况下工作-在我的代码到达它抛出的群的析构函数。