簡體   English   中英

如果匹配特定類,則從基類對象的向量中移除對象

[英]Removing object from vector of base-class objects if matches specific class

我已經創建了一個簡單的類Animal,它是幾種不同動物的基類。 然后我創建了另一個名為Herd的類,它將Animal類型的對象存儲在向量中,並且只保留對這些對象進行操

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中刪除特定對象。 我重載了運算符 - 我希望它將一些Animal派生類作為參數並從vector中刪除此類的第一次出現:讓我們說vector包含Dog,Cat,Dog - 然后在調用herd-Cat之后我希望它是Dog ,狗。 我會通過遍歷我的向量並找到哪個元素與arg對象匹配來做到這一點。

不幸的是,在將Cat作為參數傳遞之后,我的類將其視為Animal類型,因此無論我傳遞給函數,第一個元素總是被刪除。

我試圖通過制作一個指針向量來實現這一點,而不是對象,但是我的整個程序再次覆蓋了錯誤,我不知道如何修復以使整個過程發揮作用。

在這種情況下,您將體驗對象切片 為了使它工作,你將不得不使用指針。 但是,將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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM