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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kniazik
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 25
#1

Вопрос по исключениям в шаблонах классов - C++

10.06.2011, 20:56. Просмотров 1403. Ответов 21
Метки нет (Все метки)

Кто подскажет как реализовать исключения в следующей задаче:

Создать шаблонный класс, в котором создать одномерный массив и найти сумму элементов от n до m.

Не могу понять как это сделать, кто может подсказать - буду благодарен, заранее СПАСИБО.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2011, 20:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос по исключениям в шаблонах классов (C++):

Посоветуйте сайт или книгу где хорошо изложена информация о ШАБЛОНАХ КЛАССОВ - C++
Посоветуйте сайт или книгу где хорошо изложена информация о ШАБЛОНАХ КЛАССОВ До этого читал: 1) С.Прата "Язык программирования...

Вопрос про утилизацию классов - C++
Как выполнить утилизацию класса? Допустим я написал код прототипа класса(интерфейс) и код определения класса. Теперь надо очереди...

Вопрос. Чем отличаются структуры в С++ от классов в C++ - C++
Приветствую. Никак не могу понять чем же все таки отличаются структуры от классов, кроме того что в структуре по умолчанию все члены...

Дружественные функции в шаблонах - C++
Как использовать дружественные функции в шаблонах? ( C++ Builder)

ошибка в шаблонах функций - C++
Есть у меня программа из нескольких файлов . с шаблонами для функций ... компилятор выдает следующий ошибку -> "/main.cpp:17: undefined...

Typename в шаблонах класса - C++
В таком шаблоне: template <typename T, int n, bool islong=???> class CounterA{... требуется распознать тип, то есть переменная islong...

21
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.06.2011, 21:02 #2
Например, при реализации конструктора, который собственно и создает массив, надо проверять, чтобы размер массива был больше 0.
А метод, который суммирует, наверное, должен проверять, чтобы n < m < size
При нарушении подобных условий и надо генерить исключения.
0
kniazik
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 25
10.06.2011, 21:17  [ТС] #3
Спасибо, но можно ли пример, хотя б одного исключения?
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.06.2011, 22:09 #4
А ты книжек не открывал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{    try { throw 1;                           // генерация исключения
        }
    catch(unsigned int)
        { cout << "unsigned integer" << endl;
        }
    catch(int)                                // перехватывается здесь
        { cout << "integer" << endl;
        }
    catch(double)
        { cout << "double" << endl;
        }
    return 0;
}
На экране появится слово integer, так как константа 1 по умолчанию имеет тип int.
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:01 #5
ValeryLaptev, исключения в конструкторе - это херово.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.06.2011, 23:04 #6
Цитата Сообщение от OstapBender Посмотреть сообщение
ValeryLaptev, исключения в конструкторе - это херово.
А куда деваться, если класс динамически запрашивает, например, память, а new выдает bad_alloc?
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:11 #7
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
А куда деваться, если класс динамически запрашивает, например, память, а new выдает bad_alloc?
а черт его знает.
ну по крайней мере можно обрабатывать их прямо в конструкторе, но никак не вне его, думаю.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.06.2011, 23:20 #8
Не... Исключения и были придумано ВО МНОГОМ из-за конструкторов. Ведь любая функция может вернуть результат. А конструктор - НЕТ! Как сообщить об аварии и невозможности создать объект?
Более того, придумали специальную конструкцию try-block-function - чтобы контролировать список инициализации конструктора.
Вторая причина - перегруженные операции. У них тоже лишних параметров не находится - нельзя изменять количество аргументов при перегрузке. Опять же - как сообщать об аварии? Исключением!
0
train-killer
0 / 0 / 0
Регистрация: 07.06.2011
Сообщений: 3
10.06.2011, 23:25 #9
Цитата Сообщение от OstapBender Посмотреть сообщение
можно обрабатывать их прямо в конструкторе, но никак не вне его, думаю.
Обработка ошибок вне конструктора необходима, что бы сообщить коду, вызывающему конструктор, что создание объекта провалилось.
По моему, это как раз и была одна из причин, по которым в С++ включили конструкцию try...catch.


Упс! Опоздал с ответом ))
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.06.2011, 23:31 #10
Цитата Сообщение от OstapBender Посмотреть сообщение
а черт его знает.
ну по крайней мере можно обрабатывать их прямо в конструкторе, но никак не вне его, думаю.
Это касается, в первую очередь, деструкторов. Почитайте Герба Саттера - он хорошо объясняет, почему. Можно и у Скотта Мейерса найти мысли по этому вопросу.
А для конструкторов нормально генерить исключения в случае аварии.
1
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:37 #11
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Почитайте Герба Саттера - он хорошо объясняет, почему.
хорошо, добавлю в длинный список того что надо прочитать)

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
А для конструкторов нормально генерить исключения в случае аварии.
даже не знаю...
если создание объекта на середине прервалось, и исключение перехвачено вне конструктора, то единственный способ уйти без потерь это немедленно завершить программу, или как иначе?
ну а если нам не надо завершать программу.. а в конце стоит вожделенный delete obj;
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.06.2011, 23:41 #12
OstapBender, не обязательно. Если вы внимательно почитаете С++, то обнаружите, что, например, при вызове new в конструкторе - утечек не происходит...
Или например, конструктор не открыл файл. Это решать должна та функция, которая создавала объект, а он - не создался.
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:50 #13
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Если вы внимательно почитаете С++
какой именно?))

вот сваял 2 примера как я это понимаю:

1 - исключение обрабатывается в конструкторе - тут всё вроде-бы неплохо
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class a {
    int *i;
 
public:
    a(int v) {
 
        try {
        if (v<=0) throw 1;
 
        i = new int[v];
 
        } catch(int) {
            i=0;
        }
        
        std::cout << "ctor ok\n";
 
    }
    ~a() {
        if (i)
        delete[] i; 
        std::cout << "dtor ok\n";
    }
 
};
 
 
 
int main()
{
    a* ob;
 
    try {
    ob = new a(-5);
    } catch(int) {
        std::cout << "Bad alloc\n";
    }
 
    delete ob;
 
 
 
 
    getchar();
    return 0;
}
2- выбрасываю в мейн, получаю критическую ошибку
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class a {
    int *i;
 
public:
    a(int v) {
 
        try {
        if (v<=0) throw 1;
 
        i = new int[v];
 
        } catch(int) {
            throw;
        }
        
        std::cout << "ctor ok\n";
 
    }
    ~a() {
        if (i)
        delete[] i; 
        std::cout << "dtor ok\n";
    }
 
};
 
 
 
 
 
int main()
{
    a* ob;
 
    try {
    ob = new a(-5);
    } catch(int) {
        std::cout << "Bad alloc\n";
    }
 
    delete ob;
 
 
 
 
    getchar();
    return 0;
}

если вы придете ваш пример я буду вам благодарен.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.06.2011, 00:00 #14
Все проще:
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
27
28
class a {
        int *i;
        int size;
public:
        a(int v) 
        { if (v<=0) throw 1;
          i = new int[v];
          size = v;
          std::cout << "ctor ok\n";
        }
        int size() { return size; }
        ~a() 
        {  delete[] i; 
           std::cout << "dtor ok\n";
        }
};
 
 
int main()
{
    try {
          a ob(-5);
        } catch(int) {
                std::cout << "Bad alloc\n";
        }
        system("pause");
                return 0;
}
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 00:03 #15
хехехе) ну так ваш ob создается и существует только в блоке try...
0
11.06.2011, 00:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 00:03
Привет! Вот еще темы с ответами:

Подстановка вычисляемого типа в шаблонах - C++
Товарищи. Помогите разобраться с шаблонами. С шаблонами начал разбираться вчера, и потому излагаю задачу полностью, дабы не быть...

Тип, зависимый от условия в шаблонах - C++
Возможно ли реализовать подобное: template &lt;uint8_t bits&gt; class test { // если bits &lt;= 8 typedef uint8_t storageType; //...

Доступ к элементам tuple в шаблонах - C++
Собственно, не могу понять как работать с элементами кортежа в цикле, не получается получить к ним доступ. Подскажите, кто знает, как это...

Стек на шаблонах - оцените реализацию - C++
просто хочу узнать чужое мнение, написал стек через шаблоны, оцените реализацию :) template &lt;typename T&gt; class Stack { private: ...


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

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

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