Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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++_Loops_Inheritance - Fatal编程技术网

C++ 如何循环遍历向量并调用公共覆盖函数?

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 =

我有一个向量,其中包含继承了宠物类(猫、狗、鱼等)的对象。它们都有一个名为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 = 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();