這是相當不一個問題「如何去做」這是相當「如何做正確的方式」C++ 11非擁有引用/指向unique_ptr的指針?
我開發使用Qt的編輯器,不同的部件顯示兒童和它的(成員)變量。這些小部件中的每一個都應該有一個引用/指向編輯後的孩子的顯示和更改其成員變量的指針。
第一次嘗試是舊的ANSI C方式,我學會了(並且仍然卡在)簡單的原始指針指向使用的對象。它工作正常,但由於C++ 11標準支持智能指針,建議使用它們,我試圖使用它們。
的問題是,我不太清楚什麼是「最好的方法」,在這種情況下使用它們... 閱讀Smart Pointers: Or who owns you baby?和Which kind of pointer do I use when?和其他幾個人後,我來到了不同的結論:
的首先是使用*unique_ptr
,因爲編輯的對象顯然是創建並刪除其子項的所有者。小部件只是指孩子展示或改變它們。 問題是小部件應該如何參考孩子......
現在我只是仍然使用原始指針我與unique_ptr
的get()
方法得到但這似乎有點缺陷的我。 我仍然可以意外地調用刪除指針並取消智能指針的好處。
第二種方法是使用shared_ptr
,因爲許多對象引用了孩子並對其進行編輯。在一個小部件中意外刪除它也不會造成任何傷害,因爲它仍然歸其他對象所有。 問題是他們擁有它。當我想從編輯的對象中刪除它時,我還必須指示所有小部件在它真正離開之前將其刪除。 (這又似乎有瑕疵和容易出錯)
我並不滿足於兩種方式。有沒有一種乾淨的(呃)方式來指向對象的unique_ptr
孩子?或者我錯過了一個完全不同的,更好的方法來解決這個問題?
是否需要在引用對象被警告時被引用的對象被銷燬? –
在這種情況下,我們確實需要[愚蠢的智能指針](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3514.pdf)。 –
@BenjaminLindley現在需要提醒他們刪除相應的小部件/控件,並在刪除時不使用它們。例如一個小部件需要獲取一個孩子的座標以將其放置在OpenGL渲染視圖中。但我真的試圖避免這種情況,因爲每個部件都需要對發射的信號做出反應。當所有者能夠確定對象是否存在或不存在時,它會更加理想。 – nils277