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

try-catch - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
GRANDEATH
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
10.01.2010, 15:45     try-catch #1
Читаю книгу Страуструпа. Он пишет (стр 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;
}
Что не так в первом коде?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2010, 15:45     try-catch
Посмотрите здесь:

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

C++ Try-catch-fanally
C++ Try и catch
Try-catch C++

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
10.01.2010, 19:35     try-catch #11
Ну вот, были неочевидны, теперь стали очевидны.
Yandex
Объявления
10.01.2010, 19:35     try-catch
Ответ Создать тему
Опции темы

Текущее время: 06:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru