|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.12.2010, 18:53 | #1 |
Пользователь
Регистрация: 04.12.2010
Сообщений: 23
|
Как прервать работу конструктора объекта?
Вопрос, наверное, глупый)
Нужно создать объект с помощью конструктора, в качестве параметра передаётся строка, затем в теле самого конструктора её нужно преобразовать в число. Это обязательное условие. Проблема в том, что если строку нельзя преобразовать в число, объёкт всё равно создастся, его можно будет просматривать и далее с ним работать. Разумеется, с некорректными данными. Можно ли как-то прервать создание объекта из конструктора, чтобы потом нельзя было к нему обратиться? Думала о том, чтобы проверять строку на правильность до того, как запускать конструктор. Но это, наверное, некорректно. Потому что тогда каждому, кто когда-либо захочет использовать мой класс (теоретически), придётся ещё раз писать этот код. Знающие люди, подскажите, как поступить, пожалуйста) Вот код конструктора. Код:
Последний раз редактировалось teapot; 04.12.2010 в 19:07. |
04.12.2010, 19:04 | #2 |
Пользователь
Регистрация: 15.03.2010
Сообщений: 31
|
а ты пробывала запрещать неявный вызов конструктора с помощью explicit?? тогда думаю можно было бы если строка проходит проверку, то явно вызвать конструктор, а иначе ничего не должно происходить....
|
04.12.2010, 19:09 | #3 |
Пользователь
Регистрация: 04.12.2010
Сообщений: 23
|
М, раньше с таким не сталкивалась, но сейчас поищу в инете, как это делается, и попробую. Спасибо!
|
04.12.2010, 19:17 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Я бы прикрутил к классу свойство Fail, которое показывало бы достоверные ли данные конструктор отработал. Если нет то освобождал объект сразу после его создания.
I'm learning to live...
|
04.12.2010, 19:37 | #5 | ||
Пользователь
Регистрация: 04.12.2010
Сообщений: 23
|
Цитата:
Цитата:
Хотя можно тогда воткнуть функцию, которая возвращает значение этого свойства. Спасибо) Последний раз редактировалось Stilet; 04.12.2010 в 19:59. |
||
04.12.2010, 20:25 | #6 | |
Great Code Monkey
Форумчанин
Регистрация: 09.08.2007
Сообщений: 533
|
Цитата:
Просто выбрасывайте исключение с понятным сообщением. И еще следите, чтобы не было утечек памяти. |
|
04.12.2010, 21:10 | #7 | |
Пользователь
Регистрация: 04.12.2010
Сообщений: 23
|
Цитата:
А если делать обработку исключения в главном модуле, то это, по сути, ничем не отличается от проверки свойства класса, только писать больше. Или вы что-то другое имеете ввиду? Я, откровенно говоря, пока не сильно владею всеми этими делами. |
|
04.12.2010, 21:14 | #8 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Зато программист будет однозначно знать как обработать такую ситуацию, а вдруг ему нужно при таком выполнить какие-то его особые действия? В таком случае он будет ругать предусмотренное в конструкторе исключение на чем свет стоит (по себе знаю, как достают нежданчиковые исключения, которых не всегда удобно перехватывать)
I'm learning to live...
|
|
04.12.2010, 21:37 | #9 | |||
Great Code Monkey
Форумчанин
Регистрация: 09.08.2007
Сообщений: 533
|
Цитата:
Еще не забывайте о том, что хороший код характеризуется не только краткостью, но и надежностью. Если в клиентском коде вы ничего не проверяете, то в случае функции программа продолжает работать, но либо неправильно, либо падает в совершенно другом месте с сообщением "факир был пьян и фокус не удался") В случае с исключением вы четко знаете, где ошибка. Кроме того в случае функции удалять объект должен клиентский код - это еще одно место для потенциальных ошибок. Цитата:
Цитата:
А нежданчиковых исключений не должно быть - они должны быть документированы, к тому же в большинстве вы все равно должны писать код, безопасный и нейтральный по отношению к исключениям (если никогда с таким не встречались - http://www.insidecpp.ru/art/15/ - правда описано не очень, в Саттере куда лучше). |
|||
04.12.2010, 21:40 | #10 | |
Ubuntu 10.04
Пользователь
Регистрация: 15.07.2010
Сообщений: 51
|
teapot В ООП так не делают. Как я понял вам надо реализовать класс обыкновенной дроби. Если какой-либо объект в программе становится "некорректным" не надо его удалять из памяти, пометьте его как "некорректный".
Цитата:
Вообщем вот Код:
Язык образует среду мышления и формирует представление о том, о чем мы думаем (Б. Л. Уорф)
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора | jennya | Visual C++ | 8 | 03.10.2010 19:03 |
Как прервать выполнение операции? | iskurt | Помощь студентам | 9 | 29.03.2010 18:46 |
Прервать выполнение функции? Как? | TwiX | Общие вопросы Delphi | 9 | 28.09.2009 16:36 |
Как прервать внешний цикл? | AndreyF | Общие вопросы Delphi | 15 | 15.06.2009 17:46 |
delphi 7, как прервать выполнение программы | Altera | Софт | 3 | 27.07.2008 15:14 |