如何返回对智能指针向量内对象的引用

How to return a reference to an object that is inside a vector of smart pointers

本文关键字:向量 指针 对象 引用 智能 何返回 返回      更新时间:2023-10-16

我有一个指向Image class的智能指针的vector,如下所示:

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的引用,而是对对象本身的引用)。

在中

for (auto& image : mImageVector) 

image是对mImageVector中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
    }
}

如果您必须处理列表中不存在的元素,则可以返回共享指针/指针而不是引用,如果该项不存在,则可以将该指针设置为null。

要获得指向对象的常规指针,请使用(p.get())而不是p.get。然后,要获得指向对象的引用,请取消引用指针:

return *(p.get());

正如NathanOliver帖子中所评论的那样,您的代码无法处理找不到合适图像的情况。因此,建议返回一个指针(使用p.get()Image*),以便在找不到图像的情况下返回NULL(或者也可以返回对本地staticImage的引用,这是一种选择)。但这实际上是另一个SO问题:返回一个";NULL";对象,如果搜索结果未找到