[英]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_ptr
或std::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.