2011-04-15 71 views
1

我有我在哪裏使用std :: shared_ptrs對象繼承層次中的一些邏輯。有一次,我需要根據自己的實際類型來處理這些對象,所以我使用的是雙調度(即我呼籲基類,然後依次調用與真實類型另一個對象的方法的方法,例如見GoF的訪客模式)。的std :: shared_ptr的雙回調

現在,在這一點上,我既可以傳遞給對象的引用正確類型或複印件。由於幾個原因,副本是沒有問題的。引用通常會很好,因爲調用發生在shared_ptr所在的範圍之下的一個範圍內,所以在這個調用發生時它不會被銷燬。但是,對於某些子類型,我需要將對象存儲在STL容器中,所以我需要絕對確保它不會被銷燬。顯然,裸指針或新的shared_ptrs不會在這裏工作,所以我需要獲得對這個被調用的shared_ptr的引用。

現在我做了以下內容: 我使用了一個名爲構造函數,而不是一個真實的創建對象。這將在對象內部設置一個weak_ptr,併爲該對象的使用提供shared_ptr。當發生雙重回調時,我從weak_ptr中獲得一個新的shared_ptr並將其存儲在Container中,以便該對象不會被破壞。然而,這使得我的施工邏輯真的很難看。

有沒有更好的方法來做到這一點?

回答

8

派生類從std::enable_shared_from_this - 那麼你可以在任何時候從對象中提取一個shared_ptr!

這與現在使用weak_ptr所做的事情並沒有太大的不同,但它是一種乾淨而廣爲接受的習慣用法。

相關問題