在这种情况下我会回报什么?

时间:2014-01-17 21:57:29

标签: c++ pointers reference std shared-ptr

我会发布我的代码然后解释我的查询:

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意味着在几个不同的地方有副本。为此,我真的需要返回一个引用,还是可以按值返回它?

谢谢!

4 个答案:

答案 0 :(得分:6)

返回迭代器而不是迭代器的内容。这样你可以判断你是否到了最后。

答案 1 :(得分:1)

如果预计在正常情况下getEntity 从不无法找到实体,那么您应该throw例外。

如果您希望找不到某些内容,那么您可以返回默认构造的shared_ptr <SEntity>。请务必在另一端检查。

答案 2 :(得分:0)

通过引用删除返回,然后返回一个空的共享指针:

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

  for { ... }

  return Entity();

}

通过引用返回共享指针并不是一个很好的理由。共享指针有一个默认的构造函数,基本上相当于nullptr。您可以通过将其作为bool进行测试来检查父函数。 E.g:

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

答案 3 :(得分:0)

我怀疑你需要拆分任务。对于任何正常操作(更改SEntity参数的值),您只需要返回默认构造的std :: shared_ptr或找到的实体。无需参考。

对于*替换shared_ptr *的实际内容,您可以使用类似

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

并替换实体内部的实体。

但是,您的代码仍然很奇怪 - 例如,如果您的向量中有多个包含实体的entity_name,该怎么办?