当std :: map :: at去out_of_range时要返回什么?

时间:2013-05-27 13:00:17

标签: c++ exception c++11

在游戏中,我想搜索项目地图并返回位于棋盘特定方格上的项目。但如果广场是空的怎么办? (这些项目没有存储在董事会结构中。对于这个问题,我没关系。)我有下面的代码,但我该怎么做才能返回“空”参考?

map<pair<int, int>, Item*> _items;

Item& itemAt(int row, int col) const {
    try {  
        return *_items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return // what goes here?            
    } 
}

或者这是错误的做法,我应该使用find()

4 个答案:

答案 0 :(得分:12)

如果在程序中找不到项目不是错误条件,则不返回引用(因为引用不能为null)。相反,你应该返回一个(非拥有的,最可能的)指针,如果找不到该项,则返回nullptr

Item* itemAt(int row, int col) const {
    try {  
        return _items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return nullptr;
    }   
}

另一方面,如果没有找到某个项目是一个错误,那么您可以返回一个引用(当找到该项目时)和当该项目未找到时让异常传播 - 处理它的责任属于您的代码中具有如何处理它的战略知识的部分:

Item& itemAt(int row, int col) const {
    return *_items.at(make_pair(row, col));
}

答案 1 :(得分:9)

在这种情况下,使用指针作为表示“零个或一个对象”的方法很有用:

Item* itemAt(int row, int col) const {
    try {
        return _items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return nullptr;
    }
}

但是,使用std::map::find()可能是一种更快速,更清洁的方法。

答案 2 :(得分:3)

如果客户端代码请求不存在的项目时出错,则throw报告失败并返回Item&的异常。

如果不是错误,因为value_type的{​​{1}}已经是map,将返回类型更改为Item*并返回nullptr }表示在请求位置的项目不存在并使用map::find()

为了避免已存在Node*返回类型的生命周期问题,请考虑将Item&更改为std::shared_ptr<Item>。如果客户端代码具有指向具有value_type的值的引用或原始指针,并且该元素已从map中删除,则客户端将留下悬空指针/引用。切换到map可以避免这种情况。 std::shared_ptr<Item>函数将返回itemAt()。这样做的好处是std::shared_ptr<Item>中的Item不需要明确map d。

答案 3 :(得分:1)

实际上其他人也有同样的问题: