c++ - 当 std::map::at 超出范围时返回什么?

标签 c++ exception c++11

在游戏中,我想搜索元素 map 并返回位于棋盘特定方格上的元素。但是,如果广场是空的呢? (这些项目未存储在板结构中。为了这个问题的目的,不要介意。)我有下面的代码,但是我应该怎么做才能返回“空”引用?

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()

最佳答案

如果在您的程序中找不到项目不是错误条件,那么您应该不返回引用(因为引用不能为空)。相反,您应该返回一个(非拥有,最有可能)指针,并返回 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));
}

关于c++ - 当 std::map::at 超出范围时返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16773796/

相关文章:

c++ - 如何减少 if 语句链?

c++ - OpenGL- 没有光 C++ 的平面着色

c++ - 链表错误

c# - 如何解决 C# 中数据集内存不足异常错误?

java - 如果从 UncaughtExceptionHandler 内部抛出异常会怎样?

c++ - 返回 const 引用的纯虚方法

c++ - linux获取当前目录下文件信息的方法

c# - 任务线程中抛出的异常,未被 UnobservedTaskException 捕获

c++ - 缩短嵌套变量名

C++:我怎样才能重载一个函数,以便它可以接受任何仿函数,包括指向成员函数的指针?