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

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

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

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

10.07.2011, 12:38. Просмотров 915. Ответов 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 лет

простите великодушно) создавал какие-то временные объекты из шаблона, вот они сразу и грохались. Создав нормальный экземпляр - все ок. живет пока программа не завершится. Ну надо же....такая лажа, при определении. забыть дать имя экземпляру, видать невыспался.
Вопрос соответственно снят.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2011, 12:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Страуструп. задание (C++):

Обсудите моё задание (Страуструп Б.) Последовательности слов - C++
Обсудите моё задание (Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004) 145 ст. задание 11. ...

Задача:Страуструп. 4.11.4 - C++
1.Напишите программу,которая печатает символы от 'a' до 'z' и цифры от '0' до '9' и их целые значения. 2.Проделайте то же самое для...

Страуструп и Графика - C++
Начал читать Страуструпа. По настоянию автора подключил его заголовочные файлы и библиотеку FLTK. Но программа не работает: ...

Страуструп. Грамматики. Парсер - C++
Собственно начал читать этого дядьку и наткнулся на парсер. Он объясняет суть парсинга с использование грамматик. Однако с грамматиками я...

Страуструп или С++ за 21 дней? - C++
Народ,подскажите,что лучше страуструп или Вильямс?мне кажется мне щас подойдет Вильямс,я думаю что щас нуждаюсь в основе...

дайте подсказку. Страуструп - C++
10. (*2) Напишите класс или шаблон, подходящий для реализации обратного вызова. 11. (*2.5) Напишите класс Lock (блокировка) для...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 12:50 #2
AzaKendler, в качестве предложения
3. Может все можно сделать гораздо проще?
Попробуй сделать указатель на функцию параметром шаблона.
1
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 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 известен заранее.
1
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
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 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();
0
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с)

это меня и смутило
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
11.07.2011, 12:25 #7
Ага, есть такое. А еще она спецификацию исключений игнорирует, кроме nothrow, не могу понять почему...
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.07.2011, 19:02 #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ага, есть такое. А еще она спецификацию исключений игнорирует, кроме nothrow, не могу понять почему...
Да реализовывать геморно. Да и как писал Герб Саттер - не слишком полезная конструкция...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2011, 19:02
Привет! Вот еще темы с ответами:

namespace Страуструп 3-е издание - C++
Добрый вечер народ) Читаю книгу Страуструпа 3-е издание там встретился такой фрагмент кода: namespace Stack { ...

Неизвестная функция. Книга. Страуструп - C++
Я видел похожу тему, но толком ответа не нашел. Сразу к делу. Есть функция get_token(). Она не из стандартной библиотеки, т.е. её нужно...

Книга после Бьярне Страуструп - C++
а что можно почитать после Программирование: принципы и практика использования C++ , исправленное издание, Бьярне Страуструп

Страуструп, и траблы в среде программирования - C++
Всем добрых суток! Я начал изучение где-то 3 дня назад, 3 дня от компьютера не отхожу ,читаю, делаю записи в тетради. Мне это очень...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.07.2011, 19:02
Ответ Создать тему
Опции темы

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