C++ 返回引用时返回错误
函数返回int上的引用C++ 返回引用时返回错误,c++,error-handling,reference,C++,Error Handling,Reference,函数返回int上的引用 int& MyClass::getElement(int position) { if (position < _size) return (_array[position]); return ([...]) // An Error } int&MyClass::getElement(int位置) { 如果(位置
int& MyClass::getElement(int position)
{
if (position < _size)
return (_array[position]);
return ([...]) // An Error
}
int&MyClass::getElement(int位置)
{
如果(位置<\u尺寸)
返回(_数组[位置]);
return([…])//一个错误
}
我的第一个想法是返回NULL。
但显然,引用不能为空
在这种情况下,返回错误的正确方法是什么?如果需要返回引用,则在出现错误时必须抛出异常。需要考虑的另一件事是,即使返回“int”(即不是引用),NULL也将是0(并且很容易与有效的int值“0”混淆) 如果您想坚持这个函数定义,那么抛出一个异常来发出错误信号
int& MyClass::getElement(int position)
{
if (position < _size)
return (_array[position]);
throw std::out_of_range("Invalid size to getElement");
}
int&MyClass::getElement(int位置)
{
如果(位置<\u尺寸)
返回(_数组[位置]);
抛出std::超出范围(“getElement的大小无效”);
}
各种选项,首先大致按照我的首选选项排序:
- 按照惯例,抛出异常
std::超出\u范围
- 返回指针
- 返回其他类型,其中包含定义良好的无效值,如
或std::pair
。如果您希望通过值而不是引用返回某些内容,因此无法返回指针,则此选项更为有用boost::optional
- 如果可以选择一个永远不会是有效数据的数字,则返回对静态幻数的引用。这是令人讨厌的,因为没有什么可以阻止调用者修改它
std::out_of_range
的异常。唯一不涉及幻数的方法是引发异常。我同意当前的答案,但我想补充一点:异常适用于函数无法坚持其自身接口的情况。在这种情况下,接口承诺“如果你给我一个int
,我会给你另一个int
”。由于错误案例破坏了此约定,这是一种例外情况。您还应该检查负索引,或使用无符号类型。range\u error
比invalid\u argument
更为常规(我的意思是out\u of\u range
,对不起)。