2013-11-02 3 views
1

Учитывая следующее простое объявление функции:Возврат на значение - значение индикации ошибки

vector<Date> getMonthArray(int month, int year); 

Что касается C++ 11, я могу воспользоваться MOVE семантике и вернуть даты вектор по значению без потери производительности и избежать используя «новый» и «удалить».

Проблема в том, что я не знаю, что вернуть, если функция не работает. E.G. месяц или год ниже нуля

Я не могу вернуть нуль, как я мог бы сделать с указателем, Так что я подумал о возможности: два

1) возвращает пустой массив 2) бросить исключение

Если честно, я ненавижу оба. хотел бы услышать несколько лучших решений от более опытных программистов на С ++.

EDIT:

Так, выбрасывая исключение действительно выглядит наиболее элегантное решение, поскольку оно не связано с какой-либо документации, что пользователю необходимо прочитать для того, чтобы запустить функцию должным образом (за исключением исключением того, что может быть брошенной). Я прав? или любые другие альтернативы?

+0

Выброс исключений - вот путь. – rightfold

+0

@ rightfold: нужно разработать? Как вы могли бы знать, что такое «правильное» решение для ОП в этом случае? Обработка исключений может быть сложным зверьком, а затем есть всевозможные вопросы о том, где можно проверить исключения и как именно они должны обрабатываться. Возможно, самое лучшее для кода OPs - проверить входные данные перед вызовом getMonthArray, потому что они могут, а затем есть другие функции, которые полагаются на этот проверенный ввод. Я хочу сказать, что, не зная базы данных OPs, говоря «Использовать исключения», нужно много соли. – AndyG

ответ

0

Если это может быть неудачно, пустой вектор не является ужасной идеей. Один хака, что люди, кажется, как для возвращения кодов ошибок, чтобы взять вектор в качестве опорного параметра, и изменить возвращаемое значение функции в булев, или межды, если есть несколько типов кодов возврата (может быть перечислен типом, слишком). В зависимости от возвращаемого значения для вашего вектора могут выполняться различные условия. Я думаю, что в этом случае, хотя пустой вектор хорош, если он хорошо документирован.

Пример условного параметра, булевой обратный подход

//pre: none 
//post: if month and year are valid, monthArray will contain array 
//  of months and function returns true. 
//  Otherwise returns false with no guarantees on contents of monthArray 
bool getMonthArray(int month, int year, vector<Date>& monthArray); 

Пример кодов ошибок, опорного параметра

//pre: none 
//post: if month and year are valid, monthArray will contain array 
//  of months and function returns 0 for success. 
//  If month is valid but year is not, returns -1 
//  If month is invalid, but year is not, returns -2 
//  If month and year are valid, but otherwise failed, returns -3 
int getMonthArray(int month, int year, vector<Date>& monthArray); 
0

Простой, пройти вектор и возвращают bool для успеха.

bool getMonthArray(std::vector<Date>* out, int month, int year); 

В вашей реализации верните false, если параметры недействительны.

1

Есть очень мало вариантов:

  1. Возврат особое значение нормального типа возвращаемого значения, что указывает на ошибку.
  2. Измените код ошибки (или флаг) и получите выходной аргумент (ссылку или указатель).
  3. Возвратите обертку, которая имеет как значение, так и индикатор ошибки (например, Boost.Optional).
  4. Выбросить исключение.
  5. Имейте аргументы, которые не могут быть недействительными.

Варианты с 1 по 4 довольно очевиден.

Вариант 5 не всегда возможен, но в некоторых случаях может работать осторожный выбор типов аргументов (включая перечисления) и интерпретации.

Не зная, что делает ваша функция, вот несколько советов:

а. изменить тип месяца & год на неподписанные.
b. интерпретировать «месяц» как непрерывный:

vector<Date> getMonthArray(unsigned int month, unsigned int year) { 
    year = year + month/12; 
    month = month % 12; 
    ... 
Смежные вопросы