如何使用shared_ptr返回*this?

6

参见:类似问题

下面的代码显然是危险的。问题是:你如何跟踪对*this的引用?

using namespace boost;

// MyClass Definition
class MyClass {

public:
   shared_ptr< OtherClass > createOtherClass() {
      return shared_ptr< OtherClass > OtherClass( this ); // baaad
   }
   MyClass();
   ~MyClass();
};

// OtherClass Definition
class OtherClass {

public:
   OtherClass( const *MyClass myClass );
   ~OtherClass();
};

// Call; pMyClass refcount = 1
shared_ptr< MyClass > pMyClass( new MyClass() );

// Call; pMyClass refcount = 1 => dangerous
pMyClass->createOtherClass();

我有答案(下面发布),我只想在stackoverflow上发布(这样每个人都可以纠正我是否错误)。

1
不确定为什么这被投票否决了...来自FAQ:提出并回答自己的编程问题也是完全可以的[..] - Ryan Emerle
可能是因为你在问题中发布的代码无法编译,所以被投了反对票。 - anon
不幸的是,重点并不是提供可编译的代码,而是通过省略不必要的细节来说明重点。 - Ryan Emerle
这甚至没有阐明重点。除非你展示OtherClass在其构造函数中如何使用指针,否则这个问题是毫无意义的。 - anon
2个回答

7
关键是扩展 `enable_shared_from_this` 并使用 `shared_from_this()` 方法获取指向 `*this` 的 shared_ptr。
有关详细信息,请参见此处
using namespace boost;    

// MyClass Definition
class MyClass : public enable_shared_from_this< MyClass > {

public:
   shared_ptr< OtherClass> createOtherClass() {
      return shared_ptr< OtherClass > OtherClass( shared_from_this() );
   }
   MyClass();
   ~MyClass();
};

// OtherClass Definition
class OtherClass {

public:
   OtherClass( shared_ptr< const MyClass > myClass );
   ~OtherClass();
};

// Call; pMyClass refcount = 1
shared_ptr< MyClass > pMyClass( new MyClass() );

// Call; pMyClass refcount = 2
pMyClass->createOtherClass();

1
几个问题:
你的代码无法编译!
你的代码设计不足以防止滥用/错误使用:
MyClass            x;
SharedPtr<MyClass> y = x.createOtherClass();

现在怎么办?
这似乎是一个非常好的使用案例!


你的第二点说得对。链接的文章指出“请记住,您在其上调用shared_from_this的对象必须由shared_ptr对象拥有”。最好将ctor设为私有,并提供命名构造函数(静态方法),以返回shared_ptr<MyClass>以强制执行正确的创建。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接