成员函数获取类实例的共享指针的副本

时间:2014-05-04 15:29:44

标签: c++11 shared-ptr

我正在使用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 );

有没有比这更好的东西?

1 个答案:

答案 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之前,该对象必须由共享指针拥有。