2015-11-19 33 views
1

我读了关于std::enable_shared_from_this,我理解它是如何工作的,但我不明白它旨在解决什么问题?C++ 11:std :: enable_shared_from_this现实生活中的例子?

例如从这里:What is the usefulness of `enable_shared_from_this`?

class Y: public std::enable_shared_from_this<Y> 
{ 
public: 

    std::shared_ptr<Y> f() 
    { 
     return shared_from_this(); 
    } 
}; 

std::shared_ptr<Y> p(new Y); 
std::shared_ptr<Y> q = p->f(); 

是的,伟大的,我们可以写q=p->f();,但为什么不只是 q = p;

在一般情况下,我们有shared_ptr,但由于某种原因它不可somewhere,所以我们必须把它从this恢复,但如果我们从shared_ptrsomewhere然后通过原始指针,我们有,因为所有shared_ptr安全的问题,如果我们从std::shared_ptr::get, 获取指针并将原始指针传递给某人,请离开。

回答

2

你在你的类中有一个方法需要将弱或共享指针交给它。不仅仅是返回,还可能调用一个不同的函数,将一个指向它自己的shared_ptr传递给它。

您必须使用shared-ptr-to-this来扩充该方法,将其更改为使用共享ptr的非方法,在类中存储弱ptr或从enable_shared_from_this继承。

enable_shared_from_this基本上是“存储一个weak_ptr给自己”,在shared-ptr创建代码的帮助下初始化它。

+1

'你在你的班级有一个方法,需要发出弱或共享的指针',但为什么我需要在现实生活中这种奇怪的方法? – user1244932

+1

@ user1244932自行注册某处处理程序?使用别名共享指针构造函数将共享指针传递给本身存储的变量?任何你想创建一个共享的ptr副本的原因,而不是在类之外的某些代码中,而不是在一个方法中。 – Yakk

+0

但在这种情况下,将这些东西留给'shared_ptr'的所有者是不是正确的解决方案?它看起来像黑客,当重新分解会花费太多的努力,并使用这种解决方案,但在这种情况下,为什么C++标准委员会关心这种情况? – user1244932

2

Y::f()可能要调用另一个函数,它接受shared_ptr<Y>shared_ptr到恰好是Y一个子对象或构件一些其它类型的。

+0

但是为什么我混合了'Y'和它的存储模型?我的意思是有'Y'及其实现,并且有一些方法我怎样才能管理它们的生命时间'std :: shared_ptr','std :: unique_ptr'等,为什么我必须混合这些正交的东西 – user1244932

+0

你是对的,一般来说并不好。如果可能的话,你应该避免这样做。但是,如果这太难了,'enable_shared_from_this'可以帮助你。 –

相关问题