C ++:无法从const方法将shared_ptr返回给对象

时间:2018-01-25 09:53:40

标签: c++ shared-ptr

我正在尝试将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;
        }
    }
}

3 个答案:

答案 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>>