C++ C++;迭代器运算符优先级问题*it.method()vs(*it).method()vs it->;方法()
此代码不会编译:C++ C++;迭代器运算符优先级问题*it.method()vs(*it).method()vs it->;方法(),c++,iterator,C++,Iterator,此代码不会编译: for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){ *it.update(1,1); *it.draw(); } for(vector::iterator it=shapes.end();it>=shapes.begin();--it){ *更新(1,1); *it.draw(); } 它声称: main.cpp:80:17: error: ‘s
for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){
*it.update(1,1);
*it.draw();
}
for(vector::iterator it=shapes.end();it>=shapes.begin();--it){
*更新(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’
main.cpp:80:17:错误:“std::vector::iterator”没有名为“update”的成员
main.cpp:81:17:错误:“std::vector::iterator”没有名为“draw”的成员
不过,该代码并没有尝试调用vector::iterator.draw(),而是取消了对迭代器的引用,迭代器应该为我的类框提供一个对象,该类框中确实有这些方法。
我做错了什么,为这个糟糕的标题感到抱歉。这是操作员优先权的问题 运算符
的优先级高于运算符*
。使用括号强制运算符首先应用程序*
(*it).update(1,1);
(*it).draw();
您还可以在迭代器上使用运算符->
it->update(1,1);
it->draw();
另见:和
@andre正确地指出,您也可以使用反向迭代器以反向顺序对序列进行迭代,但您应该正确地使用它们
for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it)
{
it->update(1,1);
it->draw();
}
for(vector::reverse_iterator it=shapes.rbegin();it!=shapes.rend();++it)
{
它->更新(1,1);
it->draw();
}
也要添加@Pixelchemist的答案
for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){
*it.update(1,1);
*it.draw();
}
for(vector::iterator it=shapes.end();it>=shapes.begin();--it){
*更新(1,1);
*it.draw();
}
应该是:
for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it){
*it.update(1,1);
*it.draw();
}
for(vector::reverse_iterator it=shapes.rbegin();it!=shapes.rend();++it){
*更新(1,1);
*it.draw();
}
rend
和rbeing
用于反向迭代。注意优先级<代码>*it.update(1,1)与(*it)不同。更新(1,1)
,可以写成it->update(1,1)代码>为了可读性。谢谢,这非常有效,我认为它试图调用迭代器的update方法,然后取消引用该方法的输出。我会尽快接受。你说得对。(如果类型A的任何重载操作符*
返回一个类型B的对象,该对象的成员函数具有与A相同的签名…),如果用反向迭代器
替换它
的类型,并迭代直到它!=shapes.rend()
那么您的示例是正确的(最后^^);谢谢,这实际上解决了我遇到的另一个问题。您的循环条件仍在使用运算符>=
。由于每个定义的结束迭代器都超过了数据的结尾,因此=
将导致未定义的行为,即使
是正确的(事实并非如此)。如果您不想使用=
然后将>=
替换为
(这实际上是完全相反的代码!(>=)
,因为reverse\u迭代器是迭代器的对立面,所以您也必须反转条件。)