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

C++: Cannot return a shared_ptr to an object from a const method

本文关键字:对象 shared ptr 返回 方法 const C++      更新时间:2023-10-16

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

首先,不要在堆上分配指针本身。使用std::make_shared()

GroupPointer pptr = std::make_shared<Group>(Group(*itr));

由于共享 ptr 的此实例将超出范围并将被销毁,因此最好按值返回它,而不是引用它。

std::set拥有它的元素。 std::shared_ptr(与其他shared_ptr共同(拥有它所指向的东西。您不能同时拥有两者。在此设置中使用std::shared_ptr的唯一明智方法是有一个 std::set<std::shared_ptr<Group>> .

让我们看看您当前返回的内容

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);