Я искал ответ на этот вопрос, но не нашел его.
Когда объект выдает исключение в конце конструктора, является ли объект допустимым или это один из них «зависит от метода построения»?
Пример:
struct Fraction
{
int m_numerator;
int m_denominator;
Fraction (double value,
int denominator);
};
Fraction::Fraction(double value, int denominator)
: m_numerator(0), m_denominator(denominator)
{
if (denominator == 0)
{
/* E1 */ throw std::logic_error("Denominator is zero.");
}
m_numerator = static_cast<int>(value * static_cast<double>(denominator));
double actual_value = 0.0;
actual_value = static_cast<double>(m_numerator) / static_cast<double>(m_denominator);
double error = fabs(actual_value - value);
if (error > 5.0E-5)
{
/* E2 */ throw std::logic_error("Can't represent value in exact fraction with given denominator");
}
}
Программа:
int main(void)
{
try
{
Fraction f1(3.14159264, 4); // Throws exception, E2 above.
}
catch (...)
{
cerr << "Fraction f1 not exactly representable as fraction with denom. of 4.\n";
}
// At this point, can I still use f1, knowing that it is an approximate fraction?
return EXIT_SUCCESS;
}
В этом примере, можно ли использовать f1 после того, как исключение поймано, зная, что это приблизительное значение?
Элементы данных созданы и инициализированы.
Я не вижу ни одного правила языка C ++, которое было бы нарушено вышеуказанным.
Редактировать: Изменено значение ошибки дельта с 5.0E05 до 5.0E-5.