Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
GRANDEATH
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
#1

try-catch - C++

10.01.2010, 15:45. Просмотров 1301. Ответов 10
Метки нет (Все метки)

Читаю книгу Страуструпа. Он пишет (стр 232), что можно не передавать обработчику исключений какое либо значение.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
struct Is_Not_Right_Integer {};
 
int foo(int number)
{
    if (number == 0)
        throw Is_Not_Right_Integer;
    return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        foo(0);
    }
    catch (Is_Not_Right_Integer)
    {
        cout << "Exeption: Is_Not_Right_Integer" << endl;
    }
    return 0;
}
Мне Visual Studio пишет:
error C2275: 'Is_Not_Right_Integer' : illegal use of this type as an expression
Как только добавляю конструктор - все пашет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
struct Is_Not_Right_Integer {Is_Not_Right_Integer(){}};
 
int foo(int number)
{
    if (number == 0)
        throw Is_Not_Right_Integer();
    return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        foo(0);
    }
    catch (Is_Not_Right_Integer)
    {
        cout << "Exeption: Is_Not_Right_Integer" << endl;
    }
    return 0;
}
Что не так в первом коде?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2010, 15:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос try-catch (C++):

try-catch - C++
Доброго времени суток, начал изучать исключения, и вот есть такой код: // new.cpp : Defines the entry point for the console...

Try catch - C++
try { throw pDoc-&gt;C; } catch (City) { return; } есть динамический City* C, ему присвается значение другого такого...

Try и catch - C++
Пытался сделать простую структуру,чтобы в блоке try задавалось значение переменной x, и если это значение равно,например, 5,то блок catch...

try-catch - C++
Какой тип проекта создавать в Visual Studio чтобы можно было сделать обработку исключений с try-catch? Или что сделать в Code Blocks с той...

try catch - C++
Здравствуйте. В c++ новичёк, с try catch никогда толком не работал, а тут пришлось. Нужно сделать защиту от ввода всего кроме цифр. вот...

Try-catch - C++
Добрый вечер, #include &lt;iostream&gt; using namespace std; void F1(int); void F2(int, int); void F3(int, int, int);

10
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.01.2010, 16:24 #2
Конструктор можно было не добавлять. throw требует значение, а ты ему подсовывал тип, вот он и ругался. Убери свой конструктор, но оставь throw Is_Not_Right_Integer(); со скобками.
Ну и реплика в сторону: "правое целое" - это нечто новое в математике и программировании... Для обозначения правильности лучше использовать слово Valid.
1
GRANDEATH
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
10.01.2010, 17:03  [ТС] #3
Вы гений. Спс. Я как то не подумал об этом. Кстати, а не подскажете, зачем ставить скобки, ведь у этой структуры не контруктора.
Ну и реплика в сторону: "правое целое" - это нечто новое в математике и программировании... Для обозначения правильности лучше использовать слово Valid.
Согласен.
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.01.2010, 17:50 #4
У этой структуры всё равно есть конструктор. Только он создаётся компилятором по умолчанию (ну и в данном случае совпадает с тем, что был прописан явно во втором варианте, то есть ничего не делает). Вообще есть "зловещая четвёрка" функций, которые, если их не упомянуть явно, создаются автоматически, о чём надо помнить во избежание всяких сюрпризов. Это конструктор по умолчанию (т.е. без параметров), конструктор копирования, присвоение и деструктор.
1
GRANDEATH
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
10.01.2010, 17:59  [ТС] #5
Цитата Сообщение от Nick Alte Посмотреть сообщение
конструктор копирования, присвоение
А в чем отличие?
Вот к примеру,
C++
1
2
MyClass a1(1,2,3);
MyClass a2 = a1; // Это копирование или присвоение. Мне так кажется, что присвоение. А копирование как?
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.01.2010, 18:56 #6
Конструктор копирования вызывается при создании объекта. В вышеприведённом примере вызывается именно он. Как и в
C++
1
MyClass a2(a1);
Оператор присвоения вызывается, когда мы изменяем значение уже существующего объекта.
C++
1
2
MyClass a2;
a2 = a1;   // А вот тут уже присвоение
1
GRANDEATH
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
10.01.2010, 19:04  [ТС] #7
А что бы не было таких неявных конструкторов, надо объявлять их как explicit?
0
Evg
Эксперт CАвтор FAQ
18041 / 6273 / 428
Регистрация: 30.03.2009
Сообщений: 17,259
Записей в блоге: 28
10.01.2010, 19:15 #8
Цитата Сообщение от Nick Alte Посмотреть сообщение
Конструктор копирования вызывается при создании объекта
При передаче объекта в качестве параметра функции по значению или при возврате по значению так же неявно создаётся объект-копия
1
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.01.2010, 19:23 #9
Неявный конструктор по умолчанию не создаётся, если явно описан хотя бы один любой конструктор. Остальные вещи можно либо написать самому, либо объявить самому, но не реализовывать. Разумеется, во втором случае их лучше помещать в private.
Что же до передачи в качестве параметра по значению, это такое же полноправное создание локального автоматического объекта, как и объявление обычной переменной. Ведь аргументы отличаются от автоматических локальных переменных только тем, что их начальные значения задаются в месте вызова.
1
Evg
Эксперт CАвтор FAQ
18041 / 6273 / 428
Регистрация: 30.03.2009
Сообщений: 17,259
Записей в блоге: 28
10.01.2010, 19:32 #10
Цитата Сообщение от Nick Alte Посмотреть сообщение
это такое же полноправное создание локального автоматического объекта, как и объявление обычной переменной
Более чем уверен, что для автора темы такие тонкости совсем не очевидны
1
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.01.2010, 19:35 #11
Ну вот, были неочевидны, теперь стали очевидны.
1
10.01.2010, 19:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2010, 19:35
Привет! Вот еще темы с ответами:

TRY/CATCH - C++
Здравствуйте! У меня есть: MASS; для простоты пояснения, x=rand();y=rand(),znacheniye=rand(); Как игнорировать ошибки...

try . catch - C++
можно ли провести данную операцию для функции erase у вектора??? пытался, что-то не получилось: #include &lt;vector&gt; #include &lt;algorithm&gt; ...

Блок try-catch - C++
В некоторых программах он хорошо работает и в блоке catch выводит то что написал, а в некоторых среда VS говорит &quot;Необработанное исключение...

Снова try catch - C++
Доброе утро всем!:) Недавно спрашивала как работать с блоками try ... catch. В общем, прозрение так и не пришло, но доделать код хочется....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru