2014-01-17 182 views
0

返回我會後我的代碼,然後再解釋我的查詢:我會在這種情況下

typedef std::shared_ptr<SEntity> Entity; 

//Scene_Ids is an enum 
static std::map<Scene_Ids, std::vector<Entity> > m_scene_entities; 

std::shared_ptr<SEntity>& SEntityManager::getEntity(const std::string& entity_name) 
{ 
    int counter = 0; 

    for (auto iter = m_scene_entities.begin(); iter != m_scene_entities.end(); ++iter) 
    { 
     if (iter->second[counter]->getId() == entity_name) 
      return iter->second[counter]; 

     counter++; 
    } 

    //What would I return if the entity couldn't be found? 
} 

的代碼基本上可以解釋這一切。我有一種方法,如果在映射內部的std :: vector中找到「實體」,它將返回對它的std :: shared_ptr類型的引用。但是,由於我沒有返回指針,我不能返回nullptr。我可以在失敗的情況下返回什麼。

此外,我知道std :: shared_ptr是爲了在幾個不同的地方有副本。爲此,我是否真的需要返回一個引用,或者我可以通過值來返回它嗎?

謝謝!

+1

您能否將'shared_ptr'返回給'nullptr'? – templatetypedef

+0

是不是像'std :: map :: find' vs'std :: map :: operator []'一樣的問題? – dyp

+1

@templatetypedef OP返回一個引用。 – dyp

回答

6

返回迭代器而不是迭代器的內容。這樣你就可以告訴你是否達到目的。

+0

你能詳細解釋一下嗎?我對如何使用它有點困惑。 – Peter

+0

想想'std :: map :: find'是如何工作的。它返回一個迭代器。就你而言,你可以(例如)將一個迭代器返回給找到的對象,並將一個結束迭代器返回給包含找到的對象的向量。 –

+0

你可以返回一個迭代器,並且在函數之外將它與m_scene_entities.end()進行比較,以檢查是否找到任何東西。 – Zeks

1

如果預計在正常情況下getEntity從未無法找到實體,那麼你應該throw異常。

如果您預計未能找到某些實體,那麼您可以返回默認構造的shared_ptr <SEntity>。一定要檢查另一端。

+0

+1:這是拋出異常的好用例。 –

0

刪除引用返回,然後返回一個空的共享指針:

std::shared_ptr<SEntity> SEntityManager::getEntity(const std::string& entity_name) { 

    for { ... } 

    return Entity(); 

} 

有一個很好的理由參照返回一個共享的指針不是真的。共享指針有一個默認的構造函數,基本上相當於nullptr。您可以通過測試它作爲bool在父功能中檢查它。例如:

auto val = getEntity(...); 
if (!val) { /* nothing found */ } 
0

我懷疑你需要拆分任務。對於任何正常操作(更改SEntity參數的值),您只需要返回默認構造的std :: shared_ptr或找到的實體。不需要參考。

對於*更換的shared_ptr的實際內容*你可以有一個像

void SEntityManager::replaceEntity(const std::string& entity_name, Entity* newEntity) 

和替換功能實體如果發現裏面的功能。

但是,您的代碼仍然很奇怪 - 例如,如果向量中存在多個entity_name包含實體?