Что должна вернуть функция find в результате сбоя? - PullRequest
0 голосов
/ 31 декабря 2018

Вопрос беспокоил меня с тех пор, как я впервые реализовал класс List, где мне нужен был метод для поиска узлов, данные которых равны входному значению.Если ==, то, очевидно, немедленно вернуться.А иначе?Что он должен делать тогда?

Я думал о создании исключения, но как программа будет себя вести, когда из вызова функции она распознает сбой?

Node* find_node(const T &data) {
    if (is_empty())
        std::exit(1);

    Node *temp = _head;

    while (temp != nullptr) {
        if (temp->_data == data)
            break;
        temp = temp->_next;
    }     

    return temp;
}

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

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Существует несколько распространенных способов справиться с этой ситуацией.Правильный выбор в значительной степени зависит от того, что вы возвращаете.

  1. Если вы возвращаете итератор, вы обычно хотите вернуть итератор «один за концом», который передал вызывающий объект.определите диапазон, который вы искали.
  2. С помощью указателей вы обычно возвращаете нулевой указатель (именно так и поступает код в вопросе, хотя, возможно, вы этого не осознали или забыли).
  3. Если вы возвращаете ссылку, у вас есть несколько вариантов.Один это, чтобы изменить тип возвращаемого значения с foo & на optional<foo &>.Другой способ - определить один «нулевой» объект и вернуть ссылку на него при неудаче.
0 голосов
/ 31 декабря 2018

nullptr - правильное возвращаемое значение для случая, когда поиск не удался.Это преимущество использования указателя, а не ссылки, так как вы можете вернуть ссылку, если знаете, что всегда будете иметь значение.

Код вызова должен всегда проверять наличие nullptr при получении указателя от вызова функции и учитывать тот факт, что поиск не удался.

Основные рекомендации C ++ состояние в F.60:

Предпочитать T * над T &, когда допустимым параметром является «без аргумента»

Указатель (T *) может бытьnullptr и ссылка (T &) не могут, нет действительной «нулевой ссылки».Иногда полезно иметь значение nullptr в качестве альтернативы указанному «без объекта», но если это не так, ссылка на нотацию проще и может дать лучший код.

...