更改函数以返回指针

时间:2011-08-25 14:51:15

标签: c++ pointers shared-ptr

我对C ++很陌生,我在下面编写了类和函数:

class Person {
    public:
        boost::shared_ptr<Details> GetDetails(const std::string& name) const;
        ...
    private:
        std::map<std::string, boost::shared_ptr<Details> > map;
        ...
};

inline
boost::shared_ptr<Details>
Person::GetDetails(const std::string& name) const {
    return map.find(name)->second;
}

这样可以正常工作,但我被告知让函数返回指针,如果查找失败则返回NULL。

我尝试了几件事,其中之一就是:

class Person {
    public:
        boost::shared_ptr<Details> *GetDetails(const std::string& name) const;
        ...
    private:
        std::map<std::string, boost::shared_ptr<Details> > map;
        ...
};

inline
boost::shared_ptr<Details>
*Person::GetDetails(const std::string& name) const {
    if (!map.find(name)->first.empty()) {
        return *map.find(name)->second;
    }
    return NULL;
}

给了我错误:

error: cannot convert 'Details' to 'boost::shared_ptr<Details>*' in return

我不完全确定在这做什么。任何帮助或资源都会有很大的帮助。

感谢。

3 个答案:

答案 0 :(得分:3)

您想要返回共享指针的地址,因此您需要使用&,而不是*

请注意,处理指向共享指针的指针有点奇怪。如果找不到项目,为什么不返回一个空的共享指针?

答案 1 :(得分:1)

您需要返回空boost::shared_ptr<Details>

return boost::shared_ptr<Details>();

而不是

return NULL;

同样返回指向shared_ptr的指针是个坏主意。你以前的版本看起来更好。

答案 2 :(得分:1)

在访问firstsecond之前,您应该先测试一下您的搜索内容:

inline
boost::shared_ptr<Details> 
Person::GetDetails(const std::string& name) const {
    std::map<std::string, boost::shared_ptr<Details> >::iterator i = map.find(name);

    if (i != map.end()) return i->second;
    return boost::shared_ptr<Details>(); // empty shared_ptr if not found
}

但不要返回裸指针。这将是危险的。

理由:

  • find()在最后一个条目之后返回map.end()迭代器。所以没有条目可以访问。
  • map.find(name)->first.empty()将是未定义的行为,因为地图末尾可能会显示空字符串。
  • shared_ptr执行所有内存管理。返回原始指针可能会破坏所有这些。