通常不建議使用指針。但是,如果我有一個數據成員指向或引用此數據成員沒有所有權的昂貴對象,並且此數據成員在構造過程中無法初始化(即,使該數據成員不是一個參考)。作爲懶惰初始化中數據成員的昂貴對象的指針?
有什麼更好的選擇比讓它成爲指針?
如果我讓這個數據成員成爲一個指針,我還需要寫自己的副本,賦值構造函數和析構函數嗎?
通常不建議使用指針。但是,如果我有一個數據成員指向或引用此數據成員沒有所有權的昂貴對象,並且此數據成員在構造過程中無法初始化(即,使該數據成員不是一個參考)。作爲懶惰初始化中數據成員的昂貴對象的指針?
有什麼更好的選擇比讓它成爲指針?
如果我讓這個數據成員成爲一個指針,我還需要寫自己的副本,賦值構造函數和析構函數嗎?
更好的選擇是使數據成員成爲智能指針(shared_ptr)。
這樣您就不必擔心所有權:您創建昂貴的對象,然後將智能指針作爲普通對象(複製或引用)傳遞。
當所有指向昂貴對象的shared_ptr實例都被銷燬時,指向的對象也被銷燬。
現有答案建議std::shared_ptr
成員。這違反了問題中的「無所有權」要求。不過,還有另一個智能指針,std::weak_ptr
。該指針不會導致所有權,因此它可以到期。
弱指針具有複製構造函數和賦值運算符,並帶有適當的語義。你的類的默認方法將使用這些。
weak_ptr
的一個特點是你需要鎖它們在使用共享資源時,因爲如果資源在使用它們時過期會很糟糕。這就是爲什麼你不能簡單地使用operator->
。
「*爲此數據成員沒有所有權*」那麼,第一個問題:誰*擁有「昂貴的對象」的所有權? –
@NicolBolas,其他一些班級。 – Allanqunzi