Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回引用时返回错误_C++_Error Handling_Reference - Fatal编程技术网

C++ 返回引用时返回错误

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上的引用

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
,对不起)。