2011-11-07 4 views
2

代わりにc(たとえばCustomer &c)の参照変数を使用できますか?もしそうなら、どのように?そしてこれはポインタ変数を使うのが好ましいですか?C++の参考文献と変数inside inside forループのポインタ?

for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
     it != customers_.end() ; it ++) 
    { 
     Customer *c = (*it); 
     c->PrintName(); 
     ... 
    } 
+0

イテレータを直接使用するだけではどうですか? it-> PrintName(); – Ferruccio

+0

@Ferruccio:イテレータはオブジェクトではなくポインタを参照するためです。あなたは '(* it) - >' –

+0

私は参照してくださいする必要があります。私は逃しました。 – Ferruccio

答えて

6

はい:

for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
    it != customers_.end() ; it ++) 
{ 
    Customer &c = *(*it); 
    c.PrintName(); 
    ... 
} 

(括弧は必要ありませんが、それをより明確にする。)

+1

括弧の必要はありません。 :) – Xeo

+0

これは 'const Customer 'です。' it'は 'const_iterator'だと思います。 – Nawaz

+0

@ Xeo:Jinx!.... –

3

次を行うことができます:あなたはおそらくない

for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
    it != customers_.end() ; it ++) 
{ 
    Customer const &c = **it; 
    c.PrintName(); 
    ... 
} 

しかしそれをやりたいcustomers_vector<Customer *>の代わりにvector<Customer>になり、そのPrintNameのメンバーを呼び出す代わりにoperator<<Customerにオーバーロードするとよいでしょう。これを実行すると、次のようなものを使用できます:

std::copy(customers_.begin(), customers.end(), 
      std::ostream_iterator<Customer>(std::cout, "\n")); 
+0

+1良い点。私は自分のコードの多くを参照し、参照セマンティクスから値セマンティクスに変換しました。私が見ている特定のコードは、それが可能かどうかはわかりませんが、私はそれを念頭に置いています。また、アルゴリズムの使い方を学び始めていますが、読みやすさを助けるか傷つけるかはすぐには分かりません。 – User

+0

@ユーザ:C++ 03では、*議論の対象となることが多い(特にfor_eachからメンバ関数を呼び出したり、明示的なループを使用する)。 C++ 11では、アルゴリズムがうまく動かない状況がほとんど見られませんでした。そして、希少なホールディングが消えても、ラムダなどを知っていると思っています。 –

+0

参照変数に追加した 'const'は非constメソッドを呼び出すことができませんか?もしそうなら、これは私の元のコードとは異なる動作ですが、私はこの事実を他のループでも使用できるかもしれません。 – User