-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


двухшаговая инициализация

Среда, 05 Августа 2020 г. 18:56 + в цитатник
ЫукпШ:
Цитата JoeUser @
Вывод: как RAII, так и смарт-поинтерами нужно пользоваться с оглядкой на ситуацию и прогнозы. Они замечательны - но не панацея от всех бед!

О чём это ?
я не предлагаю следить за выделением/освобождением ресурса.
Пишем свой смарт-поинтер. Задача которого следить
за операцией "if(ptr)".
Например:
Скрытый текст

    // --------------------------------------------------------------------------
    // FILE SPTR.h 2020.08.05
    // --------------------------------------------------------------------------
    // класс - указатель
    // --------------------------------------------------------------------------
    #ifndef __SPTR_20200805_H
    #define __SPTR_20200805_H
    // --------------------------------------------------------------------------
    template
    class SPTR
    {
    public:
    private:
    protected:
    T *ptr;
    public:
    WINAPI SPTR(void);
    WINAPI ~SPTR(void);
    T* WINAPI operator ->(void) const;
    void WINAPI operator = (T *ptr_);
    T& WINAPI operator * (void) const;
    // операции преобразования типа
    WINAPI operator T * (void) const;
    WINAPI operator bool ();
    };
    // --------------------------------------------------------------------------
    template
    WINAPI SPTR::SPTR(void) : ptr (NULL)
    {
    }
    // --------------------------------------------------------------------------
    template
    WINAPI SPTR::~SPTR(void)
    {
    }
    // --------------------------------------------------------------------------
    template WINAPI SPTR::operator bool ()
    {
    ::OutputDebugString(_T(__FUNCTION__));
    //..
    // вот тут можно возбудить исключительную ситуацию
    //..
    if(ptr) return true;
    else return false;
    }
    // --------------------------------------------------------------------------
    template
    void WINAPI SPTR::operator = (T *ptr_)
    {
    ptr = ptr_;
    }
    // --------------------------------------------------------------------------
    templateT& WINAPI SPTR::operator *(void)const
    {
    return *ptr;
    }
    // --------------------------------------------------------------------------
    templateT* WINAPI SPTR::operator->(void)const
    {
    return ptr;
    }
    // --------------------------------------------------------------------------
    template WINAPI SPTR::operator T* (void)const
    {
    return ptr;
    }
    // --------------------------------------------------------------------------
    #endif

https://forum.sources.ru/index.php?showtopic=419313&view=findpost&p=3835852

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку