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

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

Войти
Регистрация
Восстановить пароль
 
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

Страуструп. задание - C++

10.07.2011, 12:38. Просмотров 889. Ответов 7

насколько я понял задание - есть класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class STC
{
 unexpected_handler old;
  public:
   STC(unexpected_handler h)
   {
    old = set_unexpectef(h);
   }
  ~STC()
   {
    set_unexpected(old);
   }
}
суть его - заменить вызов unexpeted() на свою функцию а при уничтожении вернуть все как было
Задание обобщить класс до шаблона, способного работать с разными функциями - например set_terminate()

вот детище. в конструкторе принимает указатель на функцию.
например надо set_unrxpected работает с ней, надо set_terminate - работает с этой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class A, class B> class STC
{
    A old;
    B (*st)(A);//нужен чтобы вызвать функцию в деструкторе
 
public:
    
 
    STC(B (*set)(A), A t)// первый параметр указатель на функцию которую будем пользовать из стандартных, второй хандлер на мою
    {
        st = set;
        old = set(t);
 
    }
 
    ~STC(void)
    {
        st(old);
    }
};
ВОПРОСЫ
1. при простом прогоне в мэйн первый вызов set_unrxpected возвращает NULL, так и должно быть? ведь исключение то не было сгенерировано?
Для того чтобы проверить работу шаблона пришлось вначале назначить свою функцию - в set, а потом менять ее через шаблон на другую - все справно работает, указатели на мои функции корректно меняются.
2. ОДНАКО - ПОЧЕМУ данный шаблон после его генерации и инициализации членов - сразу уничтожается? сразу идет вызов деструктора. Это настораживает. Вероятно где то ошибки?
3. Может все можно сделать гораздо проще?

Добавлено через 20 лет

простите великодушно) создавал какие-то временные объекты из шаблона, вот они сразу и грохались. Создав нормальный экземпляр - все ок. живет пока программа не завершится. Ну надо же....такая лажа, при определении. забыть дать имя экземпляру, видать невыспался.
Вопрос соответственно снят.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1016 / 795 / 48
Регистрация: 30.04.2011
Сообщений: 1,614
10.07.2011, 12:50     Страуструп. задание #2
AzaKendler, в качестве предложения
3. Может все можно сделать гораздо проще?
Попробуй сделать указатель на функцию параметром шаблона.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4252 / 2784 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
10.07.2011, 20:55     Страуструп. задание #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename T, T f(T)>
class  STC{
         T old;
public:
         STC(T h){
               old = f(h);
         }
         ~STC(){
               f(old);
         }
};
//##########################################
STC<terminate_handler, set_terminate> term(myterminate);
STC<unexpected_handler, set_unexpected> expec(myunexpected);
Хотя, имхо, можно обойтись без шаблонов, т.к. параметр T известен заранее.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
10.07.2011, 21:31  [ТС]     Страуструп. задание #4
Kastaneda, да это просто задание для изучающих язык, для таких как я, чтоб так сказать отрабатывали навыки.
и конешно указатель надо в параметры, так и задумывалось но что то запутался с typedef и как то задвинул это, сделал длиннее. а так полностью согласен с Валерием. Kastaneda - спасибо это пожалуй единственно верное решение так как гораздо удобнее.

Добавлено через 21 минуту
в общем то set_unexpected это уже указка и его можно пользовать, но я что то стал городить с typedef, в параметры ввел дополнительный тип, так как увидел что, set_unexpected возвращает unexpected_function, это меня смутило, а они видимо вполне спокойно приводятся друг к другу с unexpected_handler
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4252 / 2784 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
11.07.2011, 04:17     Страуструп. задание #5
Цитата Сообщение от AzaKendler Посмотреть сообщение
а они видимо вполне спокойно приводятся друг к другу
в общем то это один и тот же тип void(*)(), только за'typedef'ен.

Добавлено через 2 минуты
Цитата Сообщение от AzaKendler Посмотреть сообщение
set_unexpected возвращает unexpected_function
прототип с cplusplus.com
C++
1
unexpected_handler set_unexpected (unexpected_handler f) throw();
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 12:06  [ТС]     Страуструп. задание #6
в 10й студии, при наведении курсора на set_unexpected всплывает подсказка
unexpected_function _cdecl set_unexpected (unexpected_function_NewPtFunс)

это меня и смутило
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4252 / 2784 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
11.07.2011, 12:25     Страуструп. задание #7
Ага, есть такое. А еще она спецификацию исключений игнорирует, кроме nothrow, не могу понять почему...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2011, 19:02     Страуструп. задание
Еще ссылки по теме:

Обсудите моё задание (Страуструп Б.) Последовательности слов C++
Что имеет ввиду Страуструп? C++
C++ Страуструп FLTK newline в Out_box
C++ Страуструп. Грамматики. Парсер
Страуструп и Графика C++

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

Или воспользуйтесь поиском по форуму:
ValeryLaptev
Эксперт С++
1016 / 795 / 48
Регистрация: 30.04.2011
Сообщений: 1,614
11.07.2011, 19:02     Страуструп. задание #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ага, есть такое. А еще она спецификацию исключений игнорирует, кроме nothrow, не могу понять почему...
Да реализовывать геморно. Да и как писал Герб Саттер - не слишком полезная конструкция...
Yandex
Объявления
11.07.2011, 19:02     Страуструп. задание
Ответ Создать тему
Опции темы

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