Следующий пост -

Класс STC.

Рубрика: C++, Дата: 14 April, 2013, Автор:

Обобщите класс STC параграф 14.6.3.1 до шаблона, который использует стратегию “получение ресурса есть инициализация” для хранения и восстановления функций разных типов.

Задачки как всегда не понятные, да я уже месяц как читал про исключения. Ну да ладно надо как не будь пытаться делать. Короче пошол читать.

Так код самого класса STC из 14.6:

 

class STC
{
	unexpected_handler old;
public:
	STC(unexpected_handler f){old=set_unexpected(f);}
	~STC() {set_unexpected(old);}
};

Вообщем там отакая от фигня написана.

Я создал свой пример решения шаблон:

//klacc STC
#include <iostream>
using std::cout;
using std::endl;

template<class T>
class STC //klacc dl9 xraneni9 i voctanovleni9
{
	T old;
public:
	STC(T f){old=set_unexpected(f);}
	~STC() {set_unexpected(old);}
	T set_unexpected(T a){}
};

int main()
{
	
	
	return 0;
}

Поговорим немного о стратегии “выделение ресурса есть инициализация”. Это одна из концепции ООП, суть которой в конструкторе захватывать ресурсы, а в деструкторе их освобождать. Отакая от концепция. Как мы видим в классе функция set_unexpected видимо захватывает ресурс, а деструкторе функция set_unexpected видимо освобождает память.

Я не сильно пока в этих вопросах разбираюсь и считаю, что память можно захватить с помощью токо new, а освободить с помощью delete, но в данном примере мы не new ни delete не видим так, что не известно, что это за захват и что это за освобождение. Да скорее всего нету не какого захвата, есть но он постоянный равен весу самой переменной.

Еще считается, что стратегия “выделение ресурса есть инициализация” хорошо использовать при исключениях, но я честно не знаю посмотрим дальше. Ну видимо и хорошо, потому, что при генерации исключения из класса видимо и деструктор автоматически будет вызываться и если он не удалит (освободит) ресурсы, то они будут потеряны для системы. Ладно поживем увидим на практике как оно все работает.

[youtube]http://www.youtube.com/watch?v=peH9N9rW500[/youtube]

  • думаю Страусструп имел ввиду :

    template 
    class STC // класс для хранения и восстановления 
    { 
        F* old; 
        F*& func_int;
    public: 
        STC (F*& func, const F * const f):func_int(func), old(func) {func=f;}
        ~STC () { func_int=old;} 
    }; 
    
    void f1()
    {
        int gg=0;
        gg++;
    }
    
    void f2()
    {
        int gg=0;
        gg++;
    }
    
    typedef void ( f_t) ();
    
    f_t *f_p;
    
    void testedFunc()
    {
        STC t_stc(f_p, f2);
        f_p();
    }
    
    void testSTC()
    {
        f_p = f1;
        testedFunc();
        f_p();
    }
    • тип темплейта не пропечатался

rss