表示没有任何内容可以返回的正确样式是什么?

时间:2016-06-03 10:52:17

标签: c++

我使用unordered_maps的unordered_map存储对象:

std::unordered_map<int, std::unordered_map<int, WorldObject>> _worldObjects;

我使用此函数检索对象:

   WorldObject& objectAtLocation(int x,int y){
        if(_worldObjects.find(x)!=_worldObjects.end() && _worldObjects[x].find(y)!= _worldObjects[x].end()){
            //Contains an object
        }else{
            //Does not contain an object at that location. What should I return ?
        }
    }

如果没有对象存储在x,y,那么在这个函数中指示的正确方法是什么?

例如,我可以像这样修改函数:

//return value indicating presence of object, output the variable that data is copied into.
bool objectAtlocation(int x,int y,WorldObject& output);

有什么建议吗?

编辑:使用指针是否更好?

std::unordered_map<int, std::unordered_map<int, WorldObject*>> _worldObjects;

所以我可以这样做:

WorldObject* objectAtLocation(int x,int y){
    WorldObject* result = nullptr;

    if(_worldObjects.find(x)!=_worldObjects.end() && _worldObjects[x].find(y)!= _worldObjects[x].end()){
        //Contains an object
        result = _worldObjects[x][y];
    }else{
        //Does not contain an object at that location. Returning nullptr:
    }

    return result;
}

编辑:在坐标(x,y)处没有对象也不例外。因此我不需要抛出异常。我想表明那个地方什么都没有。

您是否可以提供示例代码以及您的答案,因为我不熟悉C ++,可能无法完全理解您的评论?

2 个答案:

答案 0 :(得分:3)

&#34;标准C ++方式&#34;将返回迭代器。 如果找不到符合您搜索条件的内容,您将返回_worldObjects.end()(编辑:在您的情况下,这不会工作,我误读了您使用容器的方式)< / p>

如果您的容器很复杂并且不适合返回迭代器,则可以将指针返回到您的对象,如果找不到该对象,则返回nullptr

编辑:

调整问题编辑中的代码示例:

WorldObject* objectAtLocation(int x,int y){
    WorldObject *result = nullptr;

    const auto xIter = _worldObjects.find(x)
    if(xIter !=_worldObjects.end()){
        const auto yIter = xIter->find(y);
        if (yIter != xIter->end()){
            //Contains an object
            result = &(*yIter);
        }
    }

    return result;
}

答案 1 :(得分:0)

有几种方法可以做到这一点,在我看来,没有理由做一些过于复杂的事情。所以我认为你自己的建议很好。

否则你可以返回一个指针然后检查,然后在找不到任何内容时返回null。

或者,您可以实现一个可以为空的类(可以是您继承的模板或类),以便检查您的实例是否为空对象。

但是,你可以为你的对象定义一个“默认”状态,这意味着null,你可以检查它,所以每当你找不到任何东西时,你都可以返回对null对象的引用。 null对象可以是静态的。