此代码无法编译:
for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){
*it.update(1,1);
*it.draw();
}
声称:
main.cpp:80:17: error: ‘std::vector<Box>::iterator’ has no member named ‘update’
main.cpp:81:17: error: ‘std::vector<Box>::iterator’ has no member named ‘draw’
但是AFAIK,该代码不会尝试调用vector :: iterator.draw(),它取消引用迭代器,它应该给我一个我的类框的对象,它有这些方法。 我做错了什么,抱歉这个糟糕的头衔。
答案 0 :(得分:8)
这是运营商优先权的问题。
运算符.
的优先级高于运算符*
。使用括号首先强制运算符*
应用程序。
(*it).update(1,1);
(*it).draw();
您还可以在迭代器上使用operator ->
。
it->update(1,1);
it->draw();
另请参阅:What is the difference between the dot (.) operator and -> in C++?和cppreference: Member access operators。
<小时/> @andre正确地说你也可以使用反向迭代器以相反的顺序迭代序列,但你应该正确使用它们。
for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it)
{
it->update(1,1);
it->draw();
}
答案 1 :(得分:1)
也,添加@Pixelchemist的答案。
for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){
*it.update(1,1);
*it.draw();
}
应该是:
for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it){
*it.update(1,1);
*it.draw();
}
rend
和rbeing
用于反向迭代。