我会发布我的代码然后解释我的查询:
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意味着在几个不同的地方有副本。为此,我真的需要返回一个引用,还是可以按值返回它?
谢谢!
答案 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,该怎么办?