Страница 1 из 1

Вопрос по функции возвращающей значение.

Добавлено: 05 янв 2010, 23:04
Dragon
Есть класс, содержащий массив данных типа double.
Есть функция, которая возвращает значение последнего элемента массива. Если список пуст, то ничего не возвращается.

Код: Выделить всё

double List::get_last() const
{
    if(size > 0)
   {
        return (element_list[size-1]);
    }
}
В таком варианте компилятор начинает ругаться:
warning: control reaches end of non-void function|
И если список пуст, то понятное дело возвращается белиберда.
Можно возвращать просто 0, но это уже значение, а не пустой список.
Как не возвращать значение у функции, которая значение возвращать то должна и не внимать предупреждениям компилятора (ну и как следствие избежать результата "ни о чем")???

Re: Вопрос по функции возвращающей значение.

Добавлено: 06 янв 2010, 02:43
Romeo
Требовать от пользователя твоего метода, чтобы он проверял то, что список не пуст снаружи. После введения такого требования можно спокойно кидать exception специального типа, если метод был вызван для пустого списка.

Код: Выделить всё


class EmptyListException : public std::logic_error
{
   EmptyListException() : logic_error("List is empty") {}
};

double List::get_last() const
{
   if(size > 0)
   {
      return (element_list[size-1]);
   }
   throw EmptyListException();
   return 0; // just to avoid compiler warning
}

Re: Вопрос по функции возвращающей значение.

Добавлено: 09 янв 2010, 05:18
BulldozerBSG
Не правильно... Если это функция она обязательно должна вернуть результат. Если список пуст то придется переписать код где то так:

Код: Выделить всё

void List::get_last(double & a) const
{
    if(size > 0)
   {
        a = (element_list[size-1]);
    }
}
Но при этом не будет известно переданная переменная изменила значение на значение из массива или нет, поэтому лучше ввести результат работы:

Код: Выделить всё

int List::get_last(double & a) const
{
    if(size > 0)
   {
        a = (element_list[size-1]);
        return 1;
    } else
    {
        return 0;
    }
}

Re: Вопрос по функции возвращающей значение.

Добавлено: 09 янв 2010, 10:32
Dragon
Romeo
BulldozerBSG
Спасибо за помощь..

Re: Вопрос по функции возвращающей значение.

Добавлено: 11 янв 2010, 22:36
Romeo
BulldozerBSG, почему сразу "не правильно"? Испокон веков известны два варианта обработки ошибки: exception throwing и return value. У каждого из подходов есть свои сторонники и свои противники, но при этом оба подхода целостны и имеют право на жизнь. Они оба правильны.

Подход return value пришёл к нам из языка С, так как в нём не было другого способа известить вызывающий код о возникшей ошибке. Именно по этой причине я являюсь сторонником использования исключений. Писать на С++ и не использовать исключения - это дикость. Моё мнение субъективно и я его никому не навязываю, однако готов отстаивать свою точку зрения с подкованными оппонентами. Остальных прошу не называть то, чего не понимаешь термином "не правильно". В таком случае более корректным будет написать: "Я не понимаю этого подхода, для меня понятней следующий подход...", и далее описание.

Re: Вопрос по функции возвращающей значение.

Добавлено: 12 янв 2010, 01:27
BulldozerBSG
Romeo, а я не вас поправлял :) И против исключений ничего не имею, кому что нравиться. Но вопрос был задан
Как не возвращать значение у функции, которая значение возвращать то должна и не внимать предупреждениям компилятора (ну и как следствие избежать результата "ни о чем")???
Наличие пустого списка не есть ошибка, просто функция в этом случае не должна возвращать результат. И при чем тут генерация исключения ума не прилажу :confused: . Да и возврат 0 тоже упоминалось
Можно возвращать просто 0, но это уже значение, а не пустой список.

Re: Вопрос по функции возвращающей значение.

Добавлено: 15 янв 2010, 23:54
Romeo
Человек задал вопрос именно в таком ключе "Как не возвращать значение у функции" по той причине, что не знал как по другому отреагировать на возникшую ошибку. Согласись, что сутью данной проблемы есть именно вопрос о том, как обработать ошибку, а не вопрос "Как не возвратить значение функции" :)