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’

ただし、私の知る限り、そのコードは vector::iterator.draw() を呼び出そうとせず、イテレータを逆参照します。これにより、これらのメソッドを持つクラスボックスのオブジェクトが得られるはずです。私は何を間違っていますか、そしてひどいタイトルで申し訳ありません。

4

2 に答える 2

8

演算子の優先順位の問題です。

operator.は operator よりも優先され*ます。*括弧を使用して、最初にオペレーターの適用を強制します。

(*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();
}

rend逆にrbeing反復するために使用されます。

于 2013-07-14T20:28:21.050 に答える