我正在用C++編寫遊戲和附帶的引擎。該引擎在很大程度上依賴於使用簡單嵌入式腳本語言的自動化。腳本可以創建對象類,在其上定義事件偵聽器,並從中生成實例。目前,必須將實例綁定到腳本全局標識符以保持其存在。這樣做的顯而易見的結果是,不存在匿名對象,這將是最常見的。維護std :: set <boost :: shared_ptr>
目前,實例使用std::set<Instance*, spatial_sort>
進行管理,其中spatial_sort
是一種按位置對實例進行排序的函子,用於渲染和碰撞檢測。假設他們不可能在五十分之一秒內移動很多東西,那麼實例將被刪除並使用其當前位置作爲提示重新插入每一幀。如果在實例中設置了dead
標誌,則將從該集合中刪除該標誌。構造函數和析構函數分別調用insert(this)
和erase(this)
。
爲了允許匿名實例,我想將該設置更改爲std::set<boost::shared_ptr<Instance>, spatial_sort>
,這將允許Instance
共享實例的所有權並保留它們的存在,直到它們自行銷燬。不幸的是,因爲insert()
的調用需要放在構造函數中,所以shared_from_this()
將不能用於獲得的shared_ptr
。 Instance
碰巧已經通過其基類繼承自boost::enable_shared_from_this<>
並不重要。
任何人都可以推薦一個合適的解決方法嗎?
編輯:
我做了我應該已經擺在首位做的,分裂Instance
類的行爲分爲兩類:Instance
和Reference
。在腳本中的表達式new SomeClass
然後將Reference
返回到新的Instance
。該Instance
對象本身使用的是shared_ptr
從來沒有成功,所以他們有責任響應自殺到合適的事件,例如,動畫的結束,水平的結束,等
感謝您的幫助!重構與任何Just Works一樣是一個很好的解決方案。
更好的是,返回shared_ptr而不是原始的。 – rlbond 2010-01-19 06:42:46
我現在正在搞這個解決方案;基本上create()只會被調用來創建匿名實例,並使用「匿名」標誌集來初始化實例。如果未設置此標誌,那麼默認情況下,實例默認使用空刪除器執行shared_ptr的insert()。目前我正在嘗試追蹤由於更改而導致的神祕的bad_weak_ptr異常。 – 2010-01-19 07:26:04
*「如果未設置此標誌,那麼實例默認執行一個shared_ptr的insert()給自己」*我不確定你到底在做什麼,但聽起來它會再次運行在施工過程中不能調用shared_from_this()。還要注意''shared_from_this()'只適用於實際存儲在某個shared_ptr中的對象。例如,靜態分配的實例上的'shared_from_this()'不起作用。 – sth 2010-01-19 07:54:58