我正在尝试将shared_ptr
返回到Group
类型的对象,该对象来自其声明中const
的方法(此项目中的要求)。
Group
个对象存储在类属性mySet<Group> groups
中,mySet
只是std::set
的实现(也是一个要求)。我试图从各个角度处理这项任务,但似乎找不到可行的解决方案。
我省略了非相关的方法和属性,以使其保持最小化和清晰。
typedef std::shared_ptr<Group> GroupPointer;
typedef mySet<Group>::const_iterator cgIterator;
class Clan{
std::string name;
mySet<Group> groups;
public:
const GroupPointer& getGroup(const std::string& group_name) const;
};
class Group{
std::string name;
public:
const std::string& getName() const;
};
const GroupPointer& Clan::getGroup(const std::string& group_name) const{
cgIterator itr = groups.begin();
for(; itr != groups.end(); itr++){
if((*itr).getName() == group_name){
GroupPointer* pptr = new GroupPointer(new Group(*itr));
return *pptr;
}
}
}
答案 0 :(得分:2)
首先,不要在堆上分配指针本身。
使用std::make_shared()
GroupPointer pptr = std::make_shared<Group>(Group(*itr));
因为共享ptr的这个实例将超出范围并且将被销毁,所以最好通过值而不是对它的引用来返回它。
答案 1 :(得分:1)
让我们看一下你目前正在回归的内容
GroupPointer* pptr = new GroupPointer(new Group(*itr));
return *pptr;
您有一个引用到动态分配的 shared_ptr
,它当前是副本的唯一所有者你的一个元素。
有一些明智的选择,有些不太明智
groups
更改为mySet<std::shared_ptr<Group>>
Clan::getGroup
的返回类型更改为std::shared_ptr<Group>
。你会写一个方法Group * const & someMethod(...)
吗?Clan::getGroup
以返回Group const &
当您找到元素
时,这两个都允许您return *itr;
不太明智
return std::make_shared(*itr);
答案 2 :(得分:1)
std::set
拥有其元素。 std::shared_ptr
拥有(与其他shared_ptr
s)所指的内容。你不能同时拥有两者。在此设置中使用std::shared_ptr
的唯一合理方法是拥有std::set<std::shared_ptr<Group>>
。