我正在使用C ++ 11共享指针。
我需要编写成员函数,将其类的实例指针添加到容器中(即在某些集合中注册(添加)它们的存在)
使用普通旧指针,我可以这样做
class myClass {
public:
void Register( std::vector< myClass* >& v_registrants )
{
v_registrants.push_back( this );
}
};
但是当集合保存共享指针时如何做同样的事情?不知何故,成员函数必须获取拥有该实例的共享指针的副本。
我不能简单地创建一个新的共享指针,因为:
如果从同一个(非shared_ptr)指针构造(或制作)两个shared_ptr,它们都将拥有指针而不共享它,当其中一个释放它时会导致潜在的访问问题(删除它的托管)对象)并将另一个指向无效的位置。(reference)
那么,如何实现以下类?
class myClass_safe {
public:
void Register( std::vector< std::shared_ptr<myClass_safe > >& v_registrants )
{
//v_registrants.push_back( this ); // compiler freaks out
}
};
作为一种解决方法,我这样做:
class myClass_safe {
public:
void Register(
std::shared_ptr<myClass_safe >& my_shared_ptr,
std::vector< std::shared_ptr<myClass_safe > >& v_registrants )
{
v_registrants.push_back( my_shared_ptr );
}
};
这导致了这个相当奇怪的代码
// register the object
object->Register( object, v_registrants );
有没有比这更好的东西?
答案 0 :(得分:1)
我相信这正是std::enable_shared_from_this
的目的。
继承std::enable_shared_from_this<classname>
为您的班级提供了一个名为shared_from_this
的成员函数,可让您安全地获得与原始所有者共享所有权的std::shared_ptr
。
所以要使用它,在你的情况下,你必须改变你的类定义:
class myClass_safe : public std::enable_shared_from_this<myClass_safe> {
public:
void Register( std::vector< std::shared_ptr<myClass_safe > >& v_registrants )
{
v_registrants.push_back( shared_from_this() );
}
};
另请注意,在调用shared_from_this之前,该对象必须由共享指针拥有。