C++ 如何循环遍历向量并调用公共覆盖函数?
我有一个向量,其中包含继承了宠物类(猫、狗、鱼等)的对象。它们都有一个名为play()的公共重写函数,我想用迭代器调用该函数 我犯了很多错误。我不确定我是否正确创建了for迭代器 代码段:C++ 如何循环遍历向量并调用公共覆盖函数?,c++,loops,inheritance,C++,Loops,Inheritance,我有一个向量,其中包含继承了宠物类(猫、狗、鱼等)的对象。它们都有一个名为play()的公共重写函数,我想用迭代器调用该函数 我犯了很多错误。我不确定我是否正确创建了for迭代器 代码段: void play_pets_x_Times (const std::vector<Pet*>& t, const int16_t x) { int i=0; while (i < x) { for(std::vector<Pet*>::iterator it =
void play_pets_x_Times (const std::vector<Pet*>& t, const int16_t x) {
int i=0;
while (i < x) {
for(std::vector<Pet*>::iterator it = t.begin(); it != t.end(); ++it) {
//error conversion from std::vector<Pet*>....
it->play(); //error request for member 'play' in....
}
i++;
}
}
void play\u pets\u x\u次(常数std::vector&t,常数int16\t x){
int i=0;
而(iplay();//请求中的成员“play”时出错。。。。
}
i++;
}
}
迭代器是类似指针的对象
另一方面,在对象中存储指针,而不是实际对象
所以,长话短说,你有两件事要取消引用,但只有一件事需要取消引用
// (*it) dereferences the iterator to get a Pet*, -> dereferences the Pet*
(*it)->play();
这应该能奏效
不,我错了。您需要一个
常量迭代器
:
std::vector::const_迭代器it=t.begin();
它应该是常量迭代器。更好的是,只需使用for(auto-it=t.begin()
,不要担心类型。更好的是,使用for(auto&p:t)
,不要担心迭代器。仅供参考,您的原始代码应该使用(*it)->play()
。第一个目的是获取对象引用(当对象是Pet*
时,第二个via->
将取消引用随后的指针以到达成员函数。谢谢!使用auto it=…修复了第一个错误。并且(*it)->play()修复了我的第二个错误。for(const auto&element:t){element->play();}
如果不将迭代器类型更改为const\u iterator
,或者更好的是直接消除它,那就不能“完成任务”。没有必要为了“完成任务”而彻底消除它,尽管我同意从长远来看可能会更好。修复了const\u iterator
问题。您可以使用auto it=t.cbegin()
std::vector<Pet*>::const_iterator it = t.begin();