2014-01-22 7 views
2

Функция возвращает ссылку на Intошибка возврата при возврате ссылочный

int&  MyClass::getElement(int position) 
{ 
    if (position < _size) 
     return (_array[position]); 
    return ([...]) // An Error 
} 

Мой первый думаю было вернуть NULL. Но, очевидно, ссылка не может быть NULL.

Каков правильный способ возврата ошибки в этом случае?

+3

Единственный способ, который не включает магическое число, - это создание исключения. – juanchopanza

+1

Я согласен с текущими ответами, но хочу добавить точку: исключение - это когда ваша функция не может придерживаться собственного интерфейса. В этом случае интерфейс обещает, что «если вы дадите мне« int », я дам вам еще один« int' назад ». Поскольку случай ошибки нарушает этот контракт, это исключительная ситуация. –

+1

Вы также должны проверить отрицательный индекс или использовать неподписанный тип. –

ответ

3

Различные варианты, грубо приказал моим предпочитаемых вариантов первого:

  • сгенерирует исключение, обычно std::out_of_range
  • Возвращает указатель
  • Возвращение другого типа с хорошо определить недопустимое значение , например std::pair<bool,int&> или boost::optional<int&>. Это более полезно, если вы хотите вернуть что-то по значению, а не ссылку, поэтому не можете вернуть указатель.
  • Верните ссылку на статическое магическое число, если вы можете выбрать номер, который никогда не будет действительным. Это неприятно, так как нет ничего, что могло бы заставить его не модифицировать.
0

Если вам нужно вернуть ссылку, вы должны выбросить исключение в случае ошибки.

0

Еще одна вещь, о которой стоит подумать, заключается в том, что даже если вы возвращаете «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"); 
} 
+0

'range_error' будет более условным, чем' invalid_argument'. –

+1

(К чему я имел ввиду «out_of_range», извините). –

1

Правильный способ заключается в исключении типа std::out_of_range в случае, если положение параметра не имеет допустимого значения.

Смежные вопросы