Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在这种情况下,我会回报什么_C++_Pointers_Reference_Std_Shared Ptr - Fatal编程技术网

C++ 在这种情况下,我会回报什么

C++ 在这种情况下,我会回报什么,c++,pointers,reference,std,shared-ptr,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&

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

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类型的引用。但是,因为我没有返回指针,所以我不能返回null ptr。在失败案例中,我可以返回什么

另外,我知道std::shared_ptr用于在多个不同的地方创建副本。为此,我真的需要返回一个引用吗,还是可以只按值返回它


谢谢

返回迭代器,而不是迭代器的内容。通过这种方式,您可以判断是否已到达终点。

如果预计在正常情况下getEntity永远不会找不到实体,那么您应该抛出一个异常


如果您希望找不到某些实体,那么可以返回默认构造的共享\u ptr。请确保在另一端检查该指针。

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

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

  for { ... }

  return Entity();

}

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

对于*替换shared_ptr*的实际内容*可以使用如下函数

void SEntityManager::replaceEntity(const std::string& entity_name, Entity* newEntity)
如果在函数中找到实体,则替换该实体


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

您能将共享的实体名称返回给nullptr吗?这不是与std::map::find vs std::map::operator[]相同的问题吗?@templatetypedef OP返回了一个引用。@dyp啊,错过了。谢谢您需要修改std::shared_ptr对象本身还是保存在其中的对象?答案取决于这一点,你能再详细说明一下吗?我对如何使用它有点困惑。想想std::map::find是如何工作的。它返回一个迭代器。例如,在您的情况下,您可以向找到的对象返回一个迭代器,向包含找到的对象的向量返回一个结束迭代器。您可以返回一个迭代器,并在函数外部将其与m_scene_entities.end进行比较,以检查是否找到了任何内容。@Zeks-这里的问题是m_scene_entities.end是映射的结尾。每个地图条目都包含一个实体向量,他想返回其中一个向量的元素。是的,当我试图给他写答案时,我已经注意到了这一点。关键是-那么你的答案就不起作用了,因为要检查迭代器是否到达终点,你需要将它与vec.end进行比较,而他不知道要检查哪个vec。。。
void SEntityManager::replaceEntity(const std::string& entity_name, Entity* newEntity)