2015-11-19 71 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'可以幫助你。 –

相關問題