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)