2010-12-18 68 views
3

描述意圖是描述所有權意圖的一個很好的方式(不使用shared_ptr的?)用的unique_ptr

class Z { }; 
class A 
{ 
    unique_ptr<Z> m_z; //want to say 'I own Z' 
}; 

class B 
{ 
    B(A & a) 
    { 
     m_z = a._z.get(); 
    } 

    Z* m_z; //want to say 'I do not own Z, just a ref...' 
} 

此外,B._z可以晃來晃去。有沒有辦法糾正這個問題,而不訴諸shared_ptr和weak_ptr?

+0

「without using shared_ptr」 - >爲什麼你不想使用shared_ptr + weak_ptr? – 2010-12-18 03:23:48

+0

我遇到了重新計數對象刪除的不可預測性問題。我現在只想堅持範圍/獨特的指針。 – jameszhao00 2010-12-18 03:26:36

+0

另外,不知道unique_ptr是否存在這個問題,但是weak_ptr的相等性測試很尷尬(/不存在?)。 – jameszhao00 2010-12-18 03:27:44

回答

2

unique_ptr適用於所有權。如果指向該對象的原始指針仍然被分發並存儲在其他地方(並且技術上共享),那麼可能會使代碼的讀者感到困惑。

如果你不想使用shared_ptr並且不想有懸掛指針,那麼觀察者模式可能會幫助你。使用它可以確保B類實例在其_z被破壞時得到信號。這可能比A中的shared_ptr和B中的weak_ptr要貴一些。對於線程安全的例子,嘗試... Boost.Signals2

我同意weak_ptr用法看起來很醜,但觀察者的事情也會增加代碼的膨脹。