2010-01-19 78 views
2

我正在用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_ptrInstance碰巧已經通過其基類繼承自boost::enable_shared_from_this<>並不重要。

任何人都可以推薦一個合適的解決方法嗎?

編輯:

我做了我應該已經擺在首位做的,分裂Instance類的行爲分爲兩類:InstanceReference。在腳本中的表達式new SomeClass然後將Reference返回到新的Instance。該Instance對象本身使用的是shared_ptr從來沒有成功,所以他們有責任響應自殺到合適的事件,例如,動畫的結束,水平的結束,等

感謝您的幫助!重構與任何Just Works一樣是一個很好的解決方案。

回答

2

你可以一個靜態方法添加到Instance,你再使用它來創建新的對象,並且也做行政的東西一樣將其添加到組:

static Instance* create(int something) { 
    boost::shared_ptr<Instance> sptr(new Instance(something)); 
    instanceset.insert(sptr); 
    return sptr.get(); 
} 

如果你想使這個唯一的出路爲了構造這個類的一個對象,你也可以使普通的構造函數爲private或protected。

關於這方面的更多信息,請參閱關於"Dynamic binding during initialization"的C++ FAQ Lite條目,這些條目不直接相關,但使用相同的技術來解決構造函數中虛擬函數使用的限制。

+3

更好的是,返回shared_ptr而不是原始的。 – rlbond 2010-01-19 06:42:46

+0

我現在正在搞這個解決方案;基本上create()只會被調用來創建匿名實例,並使用「匿名」標誌集來初始化實例。如果未設置此標誌,那麼默認情況下,實例默認使用空刪除器執行shared_ptr的insert()。目前我正在嘗試追蹤由於更改而導致的神祕的bad_weak_ptr異常。 – 2010-01-19 07:26:04

+0

*「如果未設置此標誌,那麼實例默認執行一個shared_ptr的insert()給自己」*我不確定你到底在做什麼,但聽起來它會再次運行在施工過程中不能調用shared_from_this()。還要注意''shared_from_this()'只適用於實際存儲在某個shared_ptr中的對象。例如,靜態分配的實例上的'shared_from_this()'不起作用。 – sth 2010-01-19 07:54:58

相關問題