【问题标题】:member function obtains copy of shared pointer to class instance成员函数获取指向类实例的共享指针的副本
【发布时间】: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


【解决方案1】:

我相信这正是std::enable_shared_from_this 的用途。

std::enable_shared_from_this&lt;classname&gt; 继承为您的类提供了一个名为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 之前,该对象必须由共享指针拥有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-06-14
    • 2017-07-27
    • 2013-06-06
    • 2015-11-18
    • 2012-02-10
    相关资源
    最近更新 更多