2011-12-23 11 views
5

現在のイテレータ値へのポインタを取得できます。イベントは、私はその意志のリストを反復処理し、テストのいくつかの並べ替えを実行したいと思い発生​​は、私は2つのプライベートメンバを持つ私のクラスで

std::list<MyObject> objects; 
MyObject *selecteObj; 

リスト内のいずれかの項目に対してのみ真となります。他の場所で使用するためにその項目へのポインタを保存したいと思います。

他の場所で別の方法

if (selectedObj !=null) 
    tmpObj->doSomething(); 

std::list<MyObject>::iterator i; 
for (i = objects.begin(); i!=objects.end(); ++i){ 
    if (i->test()) 
     selectedObj = i; 
} 

iはあなたがMyObjectへのポインタのように扱うことができていても、ポインタ、そのイテレータではありませんので、しかし、これは動作しません。

イテレータが内部的に格納しているポインタを取得して、別の場所で使用することは可能ですか?

私はこれについて間違って考えていますか?

私がやろうとしていることを達成する適切な方法は何ですか?

答えて

12

イテレータが内部で保存しているポインタを別の場所で使用することは可能ですか?

*とちょうどイテレータを逆参照確かに、その後、&を経由して、オブジェクトへのポインタを取得:

selectedObj = &*i; 

サイドノートでは、あなたは、ループの前にNULLselectedObjを初期化するために覚えていたのですか?

+1

きっとあなたはない、 ''のstd ::のAddressOf(* i)を意味ですか? OPは、オブジェクトの '&' - オペレータを呼び出す方法を尋ねませんでした... –

+0

@KerrekSB:私はあなたが 'std :: addressof'(' std :: address_of'ではなく)を意味していたと思いますか? :P – Nawaz

+0

@Nawaz:ああ、私は何を言ったの? ;-) –

6

イテレータが内部で他の場所で使用するために格納しているポインタを取得できますか?

はい。 @FredOverflowが言ったように、次の操作を行います。

selectedObj = &*i; 

をただし、C++ 11の機能を使用することができれば、あなたは範囲ベースforループを使用して、より良い構文を書いて楽しむことができるように:

MyObject *selectedObj = NULL; 
for (MyObject & obj : objects) 
{ 
    if (obj.test()) 
     selectedObj = &obj; //store the address 
} 

よく見えますか?イテレータと書かれた構文の必要はありません。&*iのようになります。また、クラスMyObjectoperator &をオーバーロードしている場合、それは代わりに、あなたのオブジェクトのアドレスを取得する、operator&機能を呼び出すと同じように、そして&*iは、動作しないことに留意すべきです!もしそうなら、あなたは*iのアドレスを取得するために(MyObject*)&(char&)*iを書きました、またはC++ 11には、あなたがC++ 11使用できない場合、あなた自身を定義することができますstd::addressof(*i)使用することができますから取ら

template< class T > 
T* addressof(T& arg) { 
    return (T*)&(char&)arg; 
} 

コードをここに:std::addressof

関連する問題