![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 07.11.2008
Сообщений: 71
|
![]()
У меня такая проблема, у каждого return компилятор мне выдаёт ошибку, что ретурн должен возвращать значение, но когда ставлю 0 он мне пишет совсем обратное, что ретурн не должен возвращать значение. Я не могу понять, почему не проверяет файл на открытие ведб без конструктора работало всё как часы.
Вот мой класс: Код:
Если долго мучаться, что нибудь получится!!!
|
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
Конструктор создан для инициализации внутренних свойств класса и не может возвращать значения. поубирайте return-ы и будет работать. Обработку исключительных ситуаций можете вынести за пределы класса, или использовать throw в конструкторе
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 07.11.2008
Сообщений: 71
|
![]()
а что делает throw в инете полазал, не понял!!!
Если долго мучаться, что нибудь получится!!!
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
throw бросает исключение, которое можно перехватить и обработать. Пример:
Код:
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 07.11.2008
Сообщений: 71
|
![]()
если не сложно можно с пояснениями, я не могу понять для чего нужны исключения
Если долго мучаться, что нибудь получится!!!
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 01.09.2008
Сообщений: 178
|
![]()
Хотябы для того, чтобы приложение при возникновении ошибки/исключения не вылетало с потерей всех данных, а выводило предупреждение об ошибке и завершалось.
Быть радикальным - значит понять вещь в её корне. К.Маркс
|
![]() |
![]() |
![]() |
#7 |
Delphi Warrior
Старожил
Регистрация: 15.08.2008
Сообщений: 2,502
|
![]()
Суть этого понятия в том, что функция, которая обнаружила ошибку и не может справиться с нею,
запускает особую ситуацию, рассчитывая, что устранить проблему можно в той функции, которая прямо или опосредованно вызывала первую. Если функция рассчитана на обработку ошибок некоторого вида, она может указать это явно, как готовность перехватить данную особую ситуацию. Рассмотрим в качестве примера как для класса Vector можно представлять и обрабатывать особые ситуации, вызванные выходом за границу массива: class Vector { int* p; int sz; public: class Range { }; // класс для особой ситуации int& operator[](int i); // ... }; Предполагается, что объекты класса Range будут использоваться как особые ситуации, и запускать их можно так: int& Vector: ![]() { if (0<=i && i<sz) return p[i]; throw Range(); } Если в функции предусмотрена реакция на ошибку недопустимого значения индекса, то ту часть функции, в которой эти ошибки будут перехватываться, надо поместить в оператор try. В нем должен быть и обработчик особой ситуации: void f(Vector& v) { // ... try { do_something(v); // содержательная часть, работающая с v } catch (Vector::Range) { // обработчик особой ситуации Vector::Range // если do_something() завершится неудачно, // нужно как-то среагировать на это // сюда мы попадем только в том случае, когда // вызов do_something() приведет к вызову Vector: ![]() // из-за недопустимого значения индекса } // ... } Обработчиком особой ситуации называется конструкция catch ( /* ... */ ) { // ... } Ее можно использовать только сразу после блока, начинающегося служебным словом try, или сразу после другого обработчика особой ситуации. Служебным является и слово catch. После него идет в скобках описание, которое используется аналогично описанию формальных параметров функции, а именно, в нем задается тип объектов, на которые рассчитан обработчик, и, возможно, имена параметров (см. $$9.3). Если в do_something() или в любой вызванной из нее функции произойдет ошибка индекса (на любом объекте Vector), то обработчик перехватит особую ситуацию и будет выполняться часть, обрабатывающая ошибку. Например, определения следующих функций приведут к запуску обработчика в f(): void do_something() { // ... crash(v); // ... } void crash(Vector& v) { v[v.size()+10]; // искусственно вызываем ошибку индекса }
Mess with the best, die like the rest.
![]() Лабораторные, курсовые на Delphi\Pascal\C++ ya.flex-freelance@yandex.ru Icq - 636-954-303 |
![]() |
![]() |
![]() |
#8 |
Delphi Warrior
Старожил
Регистрация: 15.08.2008
Сообщений: 2,502
|
![]()
А ещё лучше почитай Страуструпа!!!!
Mess with the best, die like the rest.
![]() Лабораторные, курсовые на Delphi\Pascal\C++ ya.flex-freelance@yandex.ru Icq - 636-954-303 |
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
Исключения нужны для ситуаций, которые вызываемая функция не в состоянии разрулить, или когда обработку этой ситуации нужно возложить на пользователя. В показанном мною примере функция бросает исключение, если в качестве делителя выступает 0, это исключение отлавливается в пользовательском коде и соответствующим образом обрабатывается(выводится сообщение об ошибке). Как я говорил раннее можно использовать классы для специализации исключений(можно дать какому-нибудь виду исключения определённое имя и потом отлавливать именно его). Базовым классом для таких специализированных исключений, как правило, является std::exception из заголовочника exception
Вот пример с комментариями, немного надуманный, но всё же ![]() Код:
Опередили )) |
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 07.11.2008
Сообщений: 71
|
![]()
всем спосибо, начал въезжать, и скачал книгу Страуструпа, теперрь засяду за обучением!!!
Если долго мучаться, что нибудь получится!!!
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как проверить создан ли класс конструктором? | Вадим Буренков | Общие вопросы Delphi | 10 | 01.07.2009 22:47 |
массив объектов с конструктором копии | pu4koff | Общие вопросы C/C++ | 6 | 18.06.2008 17:33 |