Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование исключений 
:(
    Опции темы
Golovastik
Дата 18.12.2010, 21:20 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



Мне нужно сделать так, чтоб если я введу не число, чтоб выдало собственное исключение, чего-то данный код не срабатывает.
Получается в этмо коде, когда я ввожу число, выдаёт результат на экран всё нормально, когда же введу какие-то символы, выбрасывает консоль. Как сделать так, чтоб при вводе не числа, выдало исключение?

Код

#include <iostream>
#include <string>
using namespace std;

class A{
public:
     void f(int z){
     setlocale(LC_ALL,"");
     cout<<"Вы передали число № "<<z; 
     }
};

int main() 
{
  A * obj = new A;
  try{
  setlocale(LC_ALL,"");
  int chislo;
  cout<<"Введите число -> ";
  cin>>chislo;
  obj->f(chislo);
  cin.ignore();
  cin.get();
  delete obj;
  }catch(int z){
       cout<<"Вы передали не число!";
       cin.get();
  }


}


Это сообщение отредактировал(а) Golovastik - 18.12.2010, 21:23
PM MAIL   Вверх
Golovastik
Дата 18.12.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



Вот так сработало:
Код

#include <memory>
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
 
class A{
public:
     void f(int z){
     setlocale(LC_ALL,"");
     cout<<"Вы передали число № "<<z;
     }
};
 
int main()
{
  cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit );
  //A * obj = new A;
  auto_ptr<A> obj(new A());
  try{
  setlocale(LC_ALL,"");
  int chislo;
  cout<<"Введите число -> ";
  cin>>chislo;
  obj->f(chislo);
  cin.ignore();
  cin.get();
    }catch (istream::failure& e){
       cout<<"Вы передали не число!";
  }

 getch();
  return 0;
}


Расшифруйте, вот это место желательно ясно. Что здесь делается?
Код

 auto_ptr<A> obj(new A());


и вот это:
Код

  cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit );

PM MAIL   Вверх
boostcoder
Дата 19.12.2010, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Golovastik @  18.12.2010,  22:59 Найти цитируемый пост)
Что здесь делается?

здесь делается лишнее, ненужное действие smile 
PM WWW   Вверх
Golovastik
Дата 19.12.2010, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



Хорошо, а как написать правильно?

PM MAIL   Вверх
borisbn
Дата 19.12.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Golovastik @  18.12.2010,  21:20 Найти цитируемый пост)
Как сделать так, чтоб при вводе не числа, выдало исключение?

Ввести строку, попытаться преобразовать её в число ( atoi ), при ошибке выдать исключение.
см. тут: http://forum.vingrad.ru/forum/topic-317180.html
Цитата(Golovastik @  18.12.2010,  22:59 Найти цитируемый пост)
Расшифруйте, вот это место желательно ясно. Что здесь делается?
auto_ptr<A> obj(new A());

http://cplusplus.com/reference/std/memory/auto_ptr/

Цитата(Golovastik @  18.12.2010,  22:59 Найти цитируемый пост)
и вот это:
cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit );

http://cplusplus.com/reference/iostream/ios/exceptions/


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cutwater
Дата 19.12.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



Цитата(borisbn @  19.12.2010,  10:37 Найти цитируемый пост)
Ввести строку, попытаться преобразовать её в число ( atoi ), при ошибке выдать исключение.


atoi не надежна и не может гарантировать корректное преобразование ибо

Цитата

If no valid conversion could be performed, a zero value is returned.


Поэтому для гарантированной проверки рекомендуется использовать boost::lexical_cast
(Так же существует в стандартной библиотеке С семейство ф-ций strtol и компания. Они так же обеспечивают возможность корректной обработки ошибок)


--------------------
user posted image
PM MAIL   Вверх
borisbn
Дата 19.12.2010, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(cutwater @  19.12.2010,  13:10 Найти цитируемый пост)
(Так же существует в стандартной библиотеке С семейство ф-ций strtol и компания. Они так же обеспечивают возможность корректной обработки ошибок)


у них точно также
Цитата
If no valid conversion could be performed, a zero value is returned.


поэтому, я для себя давно написал ф-цию преобразования, которая сначала проверяет, что строка не состоит из всех нулей, а затем вызывает itoa. Вот её псевдокод
Код

result = atoi( str );
if ( result == 0 && allZeros( str ) == false )
    error_handle;


а вообще, согласен. Лучше использовать готовые решения из boost или из Qt


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.