|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||||||
Исключение в конструкторе шаблонного класса15.03.2017, 10:58. Показов 3942. Ответов 43
Добрый день!
Пишу класс дробей и, соответственно, если пользователь введёт 0 в знаменатель с помощью оператора >> или с помощью конструктора с 2мя параметрами, то нужно вызвать исключение. Но как это сделать, я не понимаю. Fraction.h
Сделал так, но при генерации исключения возникает ошибка "Возникло необработанное исключение по адресу ... исключение Microsoft C++: Fraction<int>::denominatorEqualsToZero ..." Скажите, пожалуйста, как правильно выполнять исключения в конструкторах и, тем более, в шаблонных.
0
|
||||||
| 15.03.2017, 10:58 | |
|
Ответы с готовыми решениями:
43
|
| 15.03.2017, 11:03 | ||||||
|
Nishen, не знаю, поможет ли, но есть спец. форма try для конструкторов
1
|
||||||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||||||
| 15.03.2017, 11:15 [ТС] | ||||||
|
Всё равно необработанное исключение.
![]() Добавлено через 6 минут А такой подход к реализации будет верен? Вместо исключения просто информировать пользователя об ошибке:
0
|
||||||
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
| 15.03.2017, 12:07 | |
|
1
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 15.03.2017, 12:12 | |||
|
вы его и кинули. вот оно и вылетело.
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 15.03.2017, 12:25 | ||||||
|
Вы осторожнее с исключениями в конструкторе
Если конструктор бросается исключением и это исключение "ловится" вне конструктора - в таком случае деструктор не вызывается потому что объект по факту не был создан Но до выброса исключения вы могли занять память присваивая полям объекта определенные значения Это уже будет утечкой памяти
1
|
||||||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
|
| 15.03.2017, 12:30 [ТС] | |
|
Всё, я понял, в чём была моя ошибка.
Если делать так, как у меня в первом коде, при этом обернув создание объекта в try - catch, то создание объекта не произойдёт, верно? Т.е. не нужно же нигде потом самому память вычищать?
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 15.03.2017, 12:34 | ||
|
Но если деструктор не сработал, каким образом вызывается деструкторы объектов которые созданы не в динамической памяти? Просто за счет того что область видимости заканчивается?
0
|
||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||
| 15.03.2017, 12:35 [ТС] | ||
|
Я вообще, почему-то не уверен, что мой подход к реализации верен.
0
|
||
|
Любитель чаепитий
|
||
| 15.03.2017, 12:37 | ||
throw вызывает раскрутку стека до catch, ну или если catch нету, до std::terminate, при этом все автоматические объекты вызывают деструкторы.
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 15.03.2017, 12:40 | |||
|
Добавлено через 3 минуты Но в вашем случае лучше не кидать исключения А еще лучше перед тем как создаете объект сделайте проверку - если число подходит для создания объекта тогда создавайте, если нет то - не создавайте ![]() А то получается вам перед созданием объекта известно что объект с этими данными не может существовать, но при этом вы все равно пытаетесь его создать Как то не логично, согласитесь
1
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 15.03.2017, 12:43 | ||
|
если в своём конструкторе вы пофиксили проблему, и знаете как можно её порешать - не нужны никакие исключения. просто возьмите и порешайте проблему на месте. если вы не можете решить эту проблему - тогда кидаем исключение. и уже парни снаружи конструктора будут его ловить, и решать проблему. ------ вкратце: самому кидать исключение в конструкторе и самому же в конструкторе его ловить - это какой то бред.
0
|
||
|
Любитель чаепитий
|
||||||
| 15.03.2017, 12:44 | ||||||
|
Nishen, Можете в компайл тайм перенести
![]() http://rextester.com/RUAIC4921
Ну или сделать конструктор по-умолчанию и метод init, в котором можно смело бросать экзепшоны.
0
|
||||||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
|||
| 15.03.2017, 13:00 [ТС] | |||
|
Но если я, например, пишу библиотеку. Тот, кто будет пользоваться ею и не подозревает может быть, что знаменатель дроби не может ровняться нулю. Как в таком случае мне предупредить его о том, что он создает объект с невозможными значениями? Опять же, я не могу просто взять и заменить введенный пользователь нуль единицей, например, и продолжить выполнение программы, как ни в чём не бывало (я это делал тут).
0
|
|||
|
Любитель чаепитий
|
||||||
| 15.03.2017, 13:05 | ||||||
|
У вас же есть конструктор по умолчанию?
Тогда так:
0
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 15.03.2017, 13:23 | ||
|
Nishen,
Если пишите библиотеку тогда наверное исключения будут верным решением. Но при этом нужно всячески избегать создания объектов в динамической памяти до того момента, пока существует вероятность того, что будет брошено исключение Иначе будет утечка Добавлено через 33 секунды ![]() Выходит будут сделаны лишние операции
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 15.03.2017, 14:48 | |||||||
0
|
|||||||
| 15.03.2017, 14:48 | |
|
Помогаю со студенческими работами здесь
20
Исключение в конструкторе класса Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? Вызов метода у шаблонного поля, шаблонного класса В конструкторе копирования отцовского (_str) класса возникает некое "необработанное исключение" Возможно ли создание объекта шаблонного класса в функции этого класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|