【发布时间】:2014-05-04 15:29:43
【问题描述】:
我正在转向使用 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 );
没有比这更好的吗?
【问题讨论】:
-
您是否已经尝试过使用
std::enable_shared_from_this? -
顺便说一句,这听起来很复杂。也许你可以简化设计(XY 问题?)。
标签: c++11 shared-ptr