【问题标题】:Cast an iterator of a vector of shared_ptr type转换 shared_ptr 类型向量的迭代器
【发布时间】:2011-06-26 17:30:59
【问题描述】:

如何转换 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(); 
}

【问题讨论】:

标签: c++ boost iterator shared-ptr


【解决方案1】:

您不想强制转换,而是提取对对象的引用:

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

【讨论】:

  • 谢谢。如果我想使用 shared_ptr 访问它,那么以下语句是否正确?虽然它没有给出任何编译器错误,但我不确定这是否好。 type_myClass aClass = ((type_myClass)(*itr));
  • @Vijayendra:尽可能避免强制转换,更应该避免使用 C 风格的强制转换。表达式中的演员表是不需要的,你不妨说:type_myClass x = *itr;。添加不必要的强制转换意味着如果稍后容器中的类型或接收类型发生更改,编译器将无法警告您更改,您可能会在代码中创建错误。
  • 对,这很公平。再次感谢 cmets David。
【解决方案2】:

您可以通过再次取消引用来简单地获取引用。

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

    【讨论】:

    • 感谢您的建议和链接。
    猜你喜欢
    • 2013-02-16
    • 2020-11-06
    • 2018-05-30
    • 1970-01-01
    • 2018-07-16
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多