SRC: Указатель с подсчетом ссылок.
От: WolfHound  
Дата: 27.09.02 19:45
Оценка: 15 (1)
#pragma once

template<class T_C> class T_SmartRefPtr
{
    T_C* m_Ptr;
    int* m_Ref;
public:
    friend class T_SmartRefPtr;
    T_C* operator->(){return m_Ptr;}
    T_C& operator *(){return *m_Ptr;}
    T_SmartRefPtr()
        :m_Ptr(new T_C)
        ,m_Ref(new int(1))
    {}
    T_SmartRefPtr(T_C* ptr)
        :m_Ptr(ptr)
        ,m_Ref(new int(1))
    {}
    T_SmartRefPtr(const T_SmartRefPtr& h)
        :m_Ptr(h.m_Ptr)
        ,m_Ref(h.m_Ref)
    {
        (*m_Ref)++;
    }
    template<class T_CP1>T_SmartRefPtr(const T_SmartRefPtr<T_CP1>& h)
        :m_Ptr(h.m_Ptr)
        ,m_Ref(h.m_Ref)
    {
        (*m_Ref)++;
    }
    T_SmartRefPtr& operator=(const T_SmartRefPtr& h)
    {
        if(m_Ptr==h.m_Ptr) return *this;
        if(--(*m_Ref)==0)
        {
            delete m_Ptr;
            delete m_Ref;
        }
        m_Ptr=h.m_Ptr;
        m_Ref=h.m_Ref;
        (*m_Ref)++;
        return *this;
    }
    template<class T_CP1>T_SmartRefPtr& operator=(const T_SmartRefPtr<T_CP1>& h)
    {
        if(m_Ptr==h.m_Ptr) return *this;
        if(--(*m_Ref)==0)
        {
            delete m_Ptr;
            delete m_Ref;
        }
        m_Ptr=h.m_Ptr;
        m_Ref=h.m_Ref;
        (*m_Ref)++;
        return *this;
    }
    ~T_SmartRefPtr()
    {
        if(--(*m_Ref)==0)
        {
            delete m_Ptr;
            delete m_Ref;
        }
    }
};
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.