2

此代码不会编译:

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(),它取消了迭代器的引用,它应该给我一个我的类框的对象,它确实有这些方法。我做错了什么,对糟糕的标题感到抱歉。

4

2 回答 2

8

这是运算符优先级的问题。

运算符.的优先级高于运算符*。使用括号强制运算符*首先应用。

(*it).update(1,1);
(*it).draw();

您也可以operator ->在迭代器上使用。

it->update(1,1);
it->draw();

另请参阅:C++ 中的点 (.) 运算符和 -> 有什么区别?cppreference:成员访问运算符


@andre 正确地指出,您也可以使用反向迭代器以相反的顺序迭代序列,但您应该正确使用它们。

for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it)
{
  it->update(1,1);
  it->draw();
}
于 2013-07-14T20:17:55.903 回答
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();
}

rendrbeing用于反向迭代。

于 2013-07-14T20:28:21.050 回答