2015-12-21 140 views
-1

我有智能指针的vectorImageclass的载体里面,像这样:如何参考返回一个对象,它是智能指针

class Controller 
{ 
    //... 
    typedef std::vector<std::shared_ptr<Image>> ImageVector; 
    ImageVector mImageVector; 
} 

我有方法必须返回一个参考到Image,就像这样:

Image& Controller::getImage(const std::string name) 
{ 
    for (auto& image : mImageVector) 
    { 
     std::shared_ptr<Image> p = image; 
     if(p->getName() == name) //find the correct pointer to image in the vector 
      return p.get; // returns a reference to a image <---ERROR!! What should be here? 
    } 
} 

我怎么能返回引用一个对象,它的shared_ptr对这些对象的一个​​向量里面?

基本上我的主意是使搜索具有相同的字符串(在对象)的矢量作为该方法的参数的方法。如果找到,则返回对该对象的引用(不是对shared_ptr,而是对象本身)。

+0

做到像你,如果shared_ptr的是不是矢量的内部。 – juanchopanza

+0

因为你需要一个可变的空图像,如果图像无法找到 - 不行! –

回答

3

for (auto& image : mImageVector) 

imagemImageVector到的std :: shared_ptr的一个参考。要返回对Image的引用,请将其解除引用。

Image& Controller::getImage(const std::string name) 
{ 
    for (auto& image : mImageVector) 
    { 
     if(image->getName() == name) //find the correct pointer to image in the vector 
      return *image; //return the Image 
    } 
} 

如果你有对付不存在于列表中的元素,那么你可以返回一个共享指针/指针,而不是一个参考,并设置指针,如果该项目不存在为空。

+0

如果没有找到合适的图像? – juanchopanza

2

为了拿到常规指针对象,使用(p.get())p.get。然后,才能到尖对象的引用,取消引用指针:

return *(p.get()); 

上NathanOliver后评论,你的代码不处理在没有合适的图像可能被发现的情况下。因此,这将被推荐到返回(使用p.get()Image*)指针,以便NULL可以返回,如果没有图像发现(或者你也可以返回参照当地staticImage,这是一个二选一)。但是,这是actuallyanother SO问题:Return a "NULL" object if search result not found