C++:无法从 const 方法返回对象的shared_ptr
C++: Cannot return a shared_ptr to an object from a const method
我正在尝试将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);
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 将GoogleMock与Boost::Shared Pointers一起使用时泄漏的Mock对象
- 在python中打开共享对象文件时出错(OSError: cannot open shared object file: