的原因之一,對於具有unique_ptr
和shared_ptr
是複製和周圍雜耍這些指針是一種廉價的操作,並不涉及複製基礎對象。
這就是爲什麼智能指針不能實現任何手段來安裝您自己的operator=
。正如我理解你的問題,當智能指針被複制時,你想要調用自定義的Clone()
和Destroy()
方法。
那麼,unique_ptr
和shared_ptr
執行自己operator=
這是正確的事情。
對於初學者來說,無論你的Destroy()
是做什麼都應該在你的類的析構函數中完成。這是一個析構函數。然後,您的clone()
方法只需要克隆自己的對象,並返回一個新的unique_ptr
,因此,當您已經有一個現有的unique_ptr
或shared_ptr
時,使用它調用clone()
方法克隆該對象並返回一個智能指針指向克隆對象:
std::unique_ptr<myClass> p; // Or std::shared_ptr
// p is initialized, populated from there.
std::unique_ptr<myClass> new_p=p->clone();
具有獨特Destroy()
方法必須銷燬的對象之前被調用是產卵的錯誤無盡的遊行的邀請。在銷燬克隆對象時忘記調用它只是一個時間問題。
避免用代碼中的錯誤創建和浪費時間的最佳方法是使它們在邏輯上不可能發生。如果爲了銷燬一個對象需要做些什麼,這需要在析構函數中完成。如果爲了銷燬從另一個對象克隆的對象需要做一些額外的工作,對象需要有一個內部標誌來指示它是一個克隆對象,並且它的析構函數根據這個標準來做正確的事情。
一旦完成,通過忘記做某件事來擺脫克隆的對象,將會使代碼變得邏輯上不可行。您可以祝賀自己在未來拯救自己,免得浪費時間尋找一堆現在永遠不會創建的bug。你未來的自我會感謝你的過去的自我。只需使用智能指針就可以使用,並且從一開始就有clone()
爲您提供智能指針。
encapsulate unique_ptr。 –
將'unique_ptr'換成某種類型,併爲其執行移動和複製操作。這些動作可以默認,複製會調用'克隆'。 –
Praetorian
我懷疑你真的不想調用'Clone()',除非你想結束兩個不同的由兩個獨立的智能指針管理的類型的對象。 – Galik