Попробуйте Catch Block Создание объекта

0

Поэтому для класса, который я беру, мы практикуем перегруженные операторы, но более конкретно мы разрабатываем класс для фракций (рациональные числа). Я играю с блоками try-catch и не могу заставить его работать так, как я хочу, и не могу найти какие-либо форумы или статьи о том, что я не могу понять. Я пытаюсь создать объект рационального числа в блоке try-catch, чтобы убедиться, что значение, помещаемое в знаменатель, не является "0", и если это так, я позволяю блоку catch вызвать деконструктор для объекта. У меня этот бит работает нормально, но кажется, что мне не удастся использовать объект, созданный в блоке try-catch позже в коде, даже если конструктору удалось присвоить знаменателю ненулевое значение, Есть ли способ объявить объект в блоке try-catch, чтобы убедиться, что он не будет генерировать исключение при его создании, но все еще имеет его в рамках остальной части кода, который находится за пределами блока try-catch, но все еще находится в такая же функция или нет способа ее снять?

  • 1
    В общем, лучше всего размещать код, который вы уже пробовали и с которым сталкиваетесь.
  • 0
    Вам не нужно явно вызывать деструкторы для любого локального объекта в предложении catch. Они автоматически вызываются, когда объект выходит из области видимости по любой причине , включая исключение. Вот почему РАИИ работает.
Теги:

1 ответ

2

try ввести новую область. Вы не можете использовать ваши успешно созданные объекты вне try потому что они вышли из сферы действия и были уничтожены. Это справедливо для объектов, созданных в любом блоке, например, for или if, или любого набора { } фигурных скобок. То, что вы хотите сделать, - это переместить код, который зависит от объекта, в try.

Например:

try {
  Rat rat1(3, 1);
  Rat rat2(2, 4);
  Rat rat3 = rat1 + rat2;
  std::cout << rat3 << std::endl;
}
catch (std::exception& e) {
  // above should not throw
}

try {
  Rat rat1(3, 1);
  Rat rat2(2, 0);  // throws
  Rat rat3 = rat1 + rat2;
  std::cout << rat3 << std::endl;
}
catch (std::exception& e) {
  // code here will execute
}
  • 0
    Задумался какое-то время про крыс ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню