Функция преобразования для проверки ошибок считается хорошей? - PullRequest
49 голосов
/ 05 июня 2011

Я бы хотел иметь простой способ проверки правильности объекта. Я подумал о простой функции преобразования, что-то вроде этого:

operator bool() const { return is_valid; }

Проверка того, что он действителен, теперь будет очень простой

// is my object invalid?
if (!my_object) std::cerr << "my_object isn't valid" << std::endl;

Это считается хорошей практикой?

Ответы [ 3 ]

65 голосов
/ 05 июня 2011

В C ++ 03 вам нужно использовать идиома безопасного bool , чтобы избежать зла:

int x = my_object; // this works

В C ++ 11 вы можете использовать явное преобразование:

explicit operator bool() const
{
    // verify if valid
    return is_valid;
}

Таким образом, вам необходимо четко указать преобразование в bool, чтобы вы больше не могли совершать безумные поступки случайно (в C ++ вы всегда можете совершать безумные поступки специально):

int x = my_object; // does not compile because there's no explicit conversion
bool y = bool(my_object); // an explicit conversion does the trick

Это по-прежнему работает как обычно в таких местах, как if и while, где требуется логическое выражение, потому что условие этих операторов контекстно преобразуется в bool:

// this uses the explicit conversion "implicitly"
if (my_object)
{
    ...
}

Это задокументировано в & sect; 4 [conv] :

Выражение e может быть неявно преобразован в тип T тогда и только тогда, когда декларация T t=e; правильно сформирована, для какой-то придуманной временной переменной t (& Раздел; 8,5). Определенные языковые конструкции требуют, чтобы выражение было преобразуется в логическое значение. выражение e появляется в таком контекст называется контекстно преобразованным в bool и хорошо сформирован если и только если объявление bool t(e); правильно сформировано, для некоторых изобрел временную переменную t (& sect; 8.5). Эффект либо неявное преобразование такое же, как выполнение объявление и инициализация, а затем с использованием временного переменная в результате преобразования.

(Разница заключается в использовании bool t(e); вместо bool t = e;.)

Места, где происходит это контекстное преобразование в bool:

  • условия if, while и for операторов;
  • операторы логического отрицания !, логического соединения && и логического дизъюнкции ||;
  • условный оператор ?:;
  • состояние static_assert;
  • необязательное константное выражение спецификатора исключения noexcept;
12 голосов
/ 05 июня 2011

Нет , простой оператор преобразования bool - , а не , поскольку теперь вы можете проводить злые сравнения между несвязанными типами .Как правило, да, функция преобразования - это нормально.Просто используйте правильный ( идиома safe-bool ).Я не могу объяснить это лучше, чем приведенные ссылки.

0 голосов
/ 03 июля 2015

Первоначальный вопрос был

Это считается хорошей практикой?

Проблема с безопасным преобразованием bool была очень актуальна на практике, но, к счастью, теперь она решается стандартами.

Но решение, если этот подход уместен, является вопрос дизайна.

Вводя такую ​​«проверку достоверности», вы фактически заявляете, что ваши объекты могут находиться в недопустимом состоянии.То есть, говоря с точки зрения информатики, вы добавили новое отдельное значение в область значений, представленных вашими объектами.Так называемое нижнее значение

Наиболее ярким примером для области значений с таким свойством является указатель.Указатель может ссылаться на различные области памяти, но он также может быть NULL (неверно).

Таким образом, нам нужно спросить себя: действительно ли такое нижнее значение отражает природу вещей, которые мы хотим смоделировать?с нашими классами - и - действительно ли нам нужно охватить этот аспект природы в нашей модели?

Опыт показывает, что нижние значения склонны к ошибкам, их легко забыть икак правило, больше ответственности, чем актив.Если вы можете упорядочить свой код таким образом, чтобы ваши объекты не могли быть недействительными, ваш код становится проще, его легче читать, понимать и поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...