2011-06-26 59 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

[正从shared_ptr的一个正常的PTR?(HTTP的可能重复://计算器.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

对,这很公平。再次感谢大卫的评论。 –

3

你可以简单地通过抢去再次引用它的参考。

MyClass& ref = **itr; 

然后投它或任何你想要的。

3

您可以使用方法get()according to the docs

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

这意味着你可以这样做:

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

感谢您的建议和链接。 –