2011-12-02 41 views
13

是否有人知道shared_ptrweak_ptr連同懶惰的初始化夥伴一起執行?類的要求是:C++中的共享,弱和懶惰指針

  • 一個lazy_ptr類,允許客戶端後構造對象(如果有的話),而不需要構造函數實現

  • 一個weak_lazy_ptr類,有三種可能的狀態:尚未構建(不會鎖定到shared_ptr),構造(將鎖定到shared_ptr)和破壞(不會鎖定到shared_ptr

我創建了一些類,它們在前一段時間完全沒有完成這項工作(see CVu article here),在其實現中使用了shared_ptrweak_ptr。與使用,而不是與它們集成共享和弱指針的模型存在的主要問題如下:

  1. 一旦所有lazy_ptr對象走出去的範圍,任何弱引用不再被鎖定,即使其他客戶持有shared_ptr版本

  2. 在不同的線程對象的建設不能被控制

我會很感激任何指向其他試圖調和這些問題,或任何工作我這方面可能會有進展。

+6

它幾乎聽起來像'shared_ptr >',是嗎? – GManNickG

+2

@ user1078210也許你可以在這裏找到更多的信息(http:// stackoverflow。COM /問題/ 878166/IS-有-C-懶惰指針)。 – ealves

+0

@GMan:'boost :: optional' * does *允許延期構建,但'boost :: shared_ptr'也允許這樣做,所以如果我理解你,這兩者都不需要。 –

回答

2

要創建不需要參數遞延施工:

boost::bind(boost::factory<T*>(), param1, param2)將創建,而無需參數在施工時進行的new T(param1, param2)等效的功能對象。

創建一個支持此遞延建設一個shared_ptr:

捆綁與標準boost::shared_ptr貴廠(一類你的創作,例如),並you'llget你所描述的結果,包括適當weak_ptr功能...

任何代碼觸發推遲建設客戶端應該運行:

your_shared_ptr.reset(your_factory()); 

不管代碼觸發對象的破壞應該運行:

your_shared_ptr.reset(); 

共享指針將僅在對象的生存evauluate到true。如果你想讓你區分「未構造」和「被破壞」,你可以在工廠運行後設置一個布爾值。