点点滴滴

  template<typename T>
            class CAutoPtr
            {
                typedef CAutoPtr<T> TSelf;
            public:
                CAutoPtr() :
                    m_pT(NULL)
                {
                }
                explicit CAutoPtr(T* pT) :
                    m_pT(pT)
                {
                    dupOrEval(pT);
                }
                CAutoPtr(const TSelf & other) :
                    m_pT(TSelf::duplicate(other.get()))
                {
                }
                TSelf& operator =(const TSelf& other)
                {
                    if (this != &other)
                    {
                        reset(other.get());
                    }
                    return *this;
                }
                TSelf& operator =(T* pT)
                {
                    if (pT == m_pT)
                    {
                        return *this;
                    }

                    free();
                    dupOrEval(pT);
                    return *this;
                }

                ~CAutoPtr()
                {
                    free();
                }
                operator const T*() const
                {
                    return m_pT;
                }
                operator T*()
                {
                    return m_pT;
                }
                T& operator *()
                {
                    return *m_pT;
                }
                const T& operator *() const
                {
                    return *m_pT;
                }
                T* operator ->()
                {
                    assert(m_pT);
                    return m_pT;
                }
                const T* operator ->() const
                {
                    assert(m_pT);
                    return m_pT;
                }
                const T* get() const
                {
                    return m_pT;
                }
                T* get()
                {
                    return m_pT;
                }

            private:
                void free()
                {
                    if (m_pT)
                    {
                        m_pT->releaseRef();
                    }
                    m_pT = NULL;
                }
                void reset(const T* pT)
                {
                    free();
                    m_pT = TSelf::duplicate(pT);
                }
                void dupOrEval(T* pT)
                {
                    if (pT)
                    {
                        if (pT->isHasPassToAutoPtr())
                        {
                            m_pT = TSelf::duplicate(pT);
                        }
                        else
                        {
                            // come from a pointer that allocated by new, the default ref count is 1
                            // not call addRef() func
                            m_pT = pT;
                            m_pT->setHasPassToAutoPtr();
                        }
                    }
                    else
                    {
                        m_pT = NULL;
                    }
                }
                static T* duplicate(const T* pT)
                {
                    T* t_pT = const_cast<T*> (pT);
                    if (t_pT != NULL)
                    {
                        t_pT->addRef();
                    }
                    return t_pT;
                }

            private:
                T * m_pT;
            };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值