Я новичок в C ++, так что мое мнение не стоит так много; но я столкнулся по крайней мере с несколькими разными подходами.
В одной библиотеке, которую я недавно использовал, каждый конструктор имеет аргумент int&
, который возвращает статус конструкции; документация для этой библиотеки гласит, что она вызовет неопределенное поведение, если результат построения недопустим. При таком подходе вызывающая сторона несет ответственность за то, чтобы не использовать недопустимый класс.
TheClass::TheClass(int &result)
{
result = -1; // or some error value
// do lots of initialisation
result = 0; // success
}
У другого, который я видел, был метод is_valid()
. Если конструкция не удалась, переменная логического члена была установлена в false и возвращалась из этого метода is_valid()
(этот метод также проверял несколько других вещей). Мне удалось увидеть источник этого и найти каждую функцию-член, начинающуюся с оператора if(is_valid())
. Не могу сказать, что я фанат этого подхода.
TheClass::TheClass() : m_valid(false)
{
// do the initialisation
if (everything_ok)
m_valid = true;
}
void TheClass::method()
{
if (!is_valid()) return;
// do some work
}
Однако недавно я читал, что исключения не такие медленные и грязные, как раньше, и их можно элегантно реализовать. Google может запретить их по любой причине, но они все еще являются частью языка C ++. С тем же успехом вы можете работать с предоставленными вам инструментами, чем строить дом с помощью только отвертки.