2012-10-06 64 views
0

我有一個Entity類定義了一個lib和Registry這是一個類,管理實體註冊到它與地圖。如何將shared_ptr傳遞給裸ptr函數

我想要做的事:

//Registry Signature 
void Registry::add(Entity* entity); 


//my function (IGameEntity subclasses Entity) 
void GameLogic::addEntity(shared_ptr<IGameEntity> entity, GameEntityId id) { 
GameEntityId entityId = entity->getId(); 
gameEntities.push_back(entity); 
Framework::Registry::instance()->add(entity); //<-- this doesn't work 
} 

我正在努力思考如何處理這個問題,因爲我保持的shared_ptr的,然後我要去必須通過一個指針。

另一件事是,如果註冊表由於某種原因被破壞,它將在地圖上剩餘的所有實體上調用delete

如果我通過entityweak_ptr<Entity>(entity)它的工作原理,但我不完全掌握如果Registry調用刪除weak_ptr會發生什麼。

如果我通過entityentity.get()當引用計數達到零或註冊表試圖刪除它時會發生什麼。

+3

你完全處於僵局,因爲你的設計是矛盾的。 'shared_ptr'非常明確且有目的地擁有資源。註冊表需要使用它(幸運的是,您已經使用'shared_ptr',這很容易),或者根本不聲稱擁有所有權。無論哪種方式,它稱爲「刪除」的事實是問題。 – GManNickG

+2

您顯然需要定義您的所有權語義。你說'Registry' *管理實體,但是,你的'GameLogic'似乎也會將'shared_ptr'存儲到這些實體中。 – Xeo

回答

3

您有兩個不兼容的所有權方案。

您需要更改其中一個,或克隆應該從一個方案轉移到另一個方案的對象。

當只有一個對象引用時,發佈shared_ptr就有一招。但你不想這樣做。即使你對圖書館內部的知識足夠了解。

因此,作爲一個實際的解決方案,更改註冊表的東西。

使之成爲shared_ptr

相關問題