我对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
我不完全确定在这做什么。任何帮助或资源都会有很大的帮助。
感谢。
答案 0 :(得分:3)
您想要返回共享指针的地址,因此您需要使用&
,而不是*
。
请注意,处理指向共享指针的指针有点奇怪。如果找不到项目,为什么不返回一个空的共享指针?
答案 1 :(得分:1)
您需要返回空boost::shared_ptr<Details>
return boost::shared_ptr<Details>();
而不是
return NULL;
同样返回指向shared_ptr
的指针是个坏主意。你以前的版本看起来更好。
答案 2 :(得分:1)
在访问first
或second
之前,您应该先测试一下您的搜索内容:
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
执行所有内存管理。返回原始指针可能会破坏所有这些。