0

我正在使用仿真框架。生成的每個粒子都有一個指向UserInfo對象的指針的槽(這樣您就可以將所需的任何信息附加到粒子上)。問題在於,只要粒子死亡,框架就會刪除這些用戶信息。由於有數以百萬計的粒子,往往有重複的信息,我只想在信息不同時創建一個新的UserInfo對象。問題當然是每當一個粒子被殺死的時候,它將刪除它有一個指針的UserInfo對象(不管這個同樣的對象是否也附着在其他粒子上)。只刪除最後一個參考,CRTP

我需要採取哪些步驟在粒子死亡時保持粒子不會刪除UserInfo對象?我知道我需要爲我的UserInfo類做一些引用計數和重載刪除。但是,我從來沒有超載刪除之前,所以我有幾個問題:

  1. 如果我有一個類層次結構,如:

    class VirtualUserInfo; 
    class A : public VirtualUserInfo; 
    class B : public A 
    ...etc 
    

    ,我重載A類中刪除,將它,如果刪除工作在指向VirtualUserInfo的指針或指向B類的指針上調用? (非常類似,如何重新載入以正常工作?是否需要爲每個新的派生類再次重新載入新內容?)

  2. 很容易用奇怪的循環模板模式進行引用計數。有沒有辦法在這種混合風格的時尚中加入刪除行爲?將這種類型的行爲應用到我要編寫的任何類型的UserInfo上會很好。

  3. 有沒有一些更酷的/更好的方式來做我想做的事情?

+3

它看起來像你需要的是一個智能指針。爲此,C++有'std :: shared_ptr'。 – Asha 2012-02-23 04:45:33

+0

我可以在任何地方使用智能指針嗎?因爲我需要使用像someFrameworkClass :: setUserInfo(VirtualUserInfo * myUserInfo); – user487100 2012-02-23 04:48:16

+0

是的,但請注意,智能指針有不同類型。看看這裏的細節:http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one爲了得到一個原始的指針出來的智能指針你必須使用像get這樣的方法。 – Asha 2012-02-23 04:50:28

回答

0

我是不知道爲什麼你需要一個包裝類...你真的不能改變你的粒子類接口嗎?指針到用戶信息部分只是看起來像這樣:

class Particle { 
    std::shared_ptr<VirtualUserInfo> mpUserInfo; 
public: 
    Particle(std::shared_ptr<VirtualUserInfo> UserInfo): 
     mpUserInfo(UserInfo) 
    {} 
}; 

任何你嘗試實現自己可能只是被複制的是已經可以與std::shared_ptr,而這最終可能是不是改變你的接口更多的工作。