2011-06-26 7 views
2

shared_ptr型のベクトルのイテレータをキャストするにはどうすればよいですか?以下の例で考えてみましょう:shared_ptr型のベクトルのイテレータをキャスト

typedef boost::shared_ptr <MyClass> type_myClass; 

vector<type_myClass> vect; 
vector<type_myClass>::iterator itr = vect.begin(); 

while(itr != vect.end()) 
{ 
    //Following statement works, but I wish to rather cast this 
    //to MyClass and then call a function? 
    (*itr)->doSomething(); 
} 
+0

可能重複します(http:// stackoverflowの.com/questions/505143/getting-a-normal-ptr-from-shared-ptr) – karlphillip

答えて

5

をあなたはキャストにしたいのではなく、オブジェクトへの参照を抽出しません:

MyClass & obj = *(*it); // dereference iterator, dereference pointer 
obj.doSomething(); 
+0

ありがとうございました。私はshared_ptrを使用してアクセスしたい場合、次のステートメントは正しいですか?それはコンパイラのエラーを与えることはありませんが、私はそれが良いかどうかはわかりません。 type_myClass aClass =((type_myClass)(* itr)); –

+0

@Vijayendra:可能なときはいつでもキャストを避け、Cスタイルのキャストを避ける。式のキャストは不要で、 'type_myClass x = * itr;'と言うこともできます。不要なキャストを追加すると、後でコンテナのタイプまたは受信タイプが変更された場合、コンパイラは変更を警告することができず、コードにバグを作成している可能性があります。 –

+0

そうです、それは非常に公正な点です。 Davidさんのコメントに感謝します。 –

3

あなたは、単に参照解除もう一度により基準をつかむことができます。

MyClass& ref = **itr; 

それから、あなたが好きなようにキャストしてください。それはあなたが行うことができることを意味し

T * get() const; // never throws 
Returns: the stored pointer. 

3

あなたは方法get()according to the docsを使用することができます[?のshared_ptrから正常なPTRを取得]の

type_myClass* ptr = *itr.get();  
ptr->doSomething(); 
+0

提案とリンクをありがとう。 –