【问题标题】:What would I return in this situation在这种情况下我会返回什么
【发布时间】:2014-01-17 21:57:28
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 您能否将shared_ptr 退回给nullptr
  • 这不是和std::map::find vs std::map::operator[]一样的问题吗?
  • @templatetypedef OP 正在返回一个引用。
  • @dyp 啊,错过了。谢谢!
  • 您是否需要修改 std::shared_ptr 对象本身或保存在其中的对象?答案取决于那个

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


【解决方案1】:

返回迭代器而不是迭代器的内容。这样你就可以知道你是否到达了终点。

【讨论】:

  • 您能详细说明一下吗?我对如何使用它有点困惑。
  • 想想std::map::find 是如何工作的。它返回一个迭代器。在您的情况下,您可以(例如)将迭代器返回到找到的对象,并将结束迭代器返回到包含找到的对象的向量。
  • 您可以返回一个迭代器并在函数外部将其与 m_scene_entities.end() 进行比较以检查是否找到任何东西。
  • @Zeks - 这里的问题是m_scene_entities.end() 是地图的尽头。每个映射条目都包含一个实体向量,他希望返回其中一个向量的元素。
  • 是的,当我试图给他写一个答案时,我已经注意到了。关键是-那么您的答案将不起作用,因为要检查迭代器是否已结束,您需要将其与 vec.end() 进行比较,而他不知道要检查哪个 vec...
【解决方案2】:

如果预计在正常情况下getEntity永远找不到实体,那么您应该throw 异常。

如果您预计无法找到某些实体,则可以返回默认构造的shared_ptr &lt;SEntity&gt;。请务必在另一端进行检查。

【讨论】:

    【解决方案3】:

    去掉引用返回,然后返回一个空的共享指针:

    std::shared_ptr<SEntity> SEntityManager::getEntity(const std::string& entity_name) {
    
      for { ... }
    
      return Entity();
    
    }
    

    实际上没有充分的理由通过引用返回共享指针。共享指针有一个默认构造函数,基本上相当于nullptr。您可以通过将其测试为bool 在父函数中对其进行检查。例如:

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

    【讨论】:

      【解决方案4】:

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

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

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

      如果在函数中找到实体,则替换它。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 2014-09-12
        • 2018-04-26
        • 2018-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多