• Gac代码库分析(3)智能指针


    主要在于引用计数的使用

    代码示例:

    template<typename T>
    class Ptr
    {
         template<typename X>
         friend class Ptr;
    protected:
        vint*                counter;
        T*                    reference;
    
        void Inc()
        {
            if(counter)
            {
                (*counter)++;
            }
        }
    
        void Dec()
        {
            if(counter)
            {
                if(--(*counter)==0)
                {
                    delete counter;
                    delete reference;
                    counter=0;
                    reference=0;
                }
            }
        }
    
        vint* Counter()const
        {
            return counter;
        }
    
        Ptr(vint* _counter, T* _reference)
            :counter(_counter)
            ,reference(_reference)
        {
            Inc();
        }
    public:
    
        Ptr()
        {
            counter=0;
            reference=0;
        }
    
        Ptr(T* pointer)
        {
            if(pointer)
            {
                counter=new vint(1);
                reference=pointer;
            }
            else
            {
                counter=0;
                reference=0;
            }
        }
    
        Ptr(const Ptr<T>& pointer)
        {
            counter=pointer.counter;
            reference=pointer.reference;
            Inc();
        }
    
        template<typename C>
        Ptr(const Ptr<C>& pointer)
        {
            T* converted=pointer.Obj();
            if(converted)
            {
                counter=pointer.Counter();
                reference=converted;
                Inc();
            }
            else
            {
                counter=0;
                reference=0;
            }
        }
    
        ~Ptr()
        {
            Dec();
        }
    
        template<typename C>
        Ptr<C> Cast()const
        {
            C* converted=dynamic_cast<C*>(reference);
            return Ptr<C>((converted?counter:0), converted);
        }
    
        Ptr<T>& operator=(T* pointer)
        {
            Dec();
            if(pointer)
            {
                counter=new vint(1);
                reference=pointer;
            }
            else
            {
                counter=0;
                reference=0;
            }
            return *this;
        }
    
        Ptr<T>& operator=(const Ptr<T>& pointer)
        {
            if(this!=&pointer)
            {
                Dec();
                counter=pointer.counter;
                reference=pointer.reference;
                Inc();
            }
            return *this;
        }
    
        template<typename C>
        Ptr<T>& operator=(const Ptr<C>& pointer)
        {
            T* converted=pointer.Obj();
            Dec();
            if(converted)
            {
                counter=pointer.Counter();
                reference=converted;
                Inc();
            }
            else
            {
                counter=0;
                reference=0;
            }
            return *this;
        }
    
        bool operator==(const T* pointer)const
        {
            return reference==pointer;
        }
    
        bool operator!=(const T* pointer)const
        {
            return reference!=pointer;
        }
    
        bool operator>(const T* pointer)const
        {
            return reference>pointer;
        }
    
        bool operator>=(const T* pointer)const
        {
            return reference>=pointer;
        }
    
        bool operator<(const T* pointer)const
        {
            return reference<pointer;
        }
    
        bool operator<=(const T* pointer)const
        {
            return reference<=pointer;
        }
    
        bool operator==(const Ptr<T>& pointer)const
        {
            return reference==pointer.reference;
        }
    
        bool operator!=(const Ptr<T>& pointer)const
        {
            return reference!=pointer.reference;
        }
    
        bool operator>(const Ptr<T>& pointer)const
        {
            return reference>pointer.reference;
        }
    
        bool operator>=(const Ptr<T>& pointer)const
        {
            return reference>=pointer.reference;
        }
    
        bool operator<(const Ptr<T>& pointer)const
        {
            return reference<pointer.reference;
        }
    
        bool operator<=(const Ptr<T>& pointer)const
        {
            return reference<=pointer.reference;
        }
    
        operator bool()const
        {
            return reference!=0;
        }
    
        T* Obj()const
        {
            return reference;
        }
    
        T* operator->()const
        {
            return reference;
        }
    };
    

    1

  • 相关阅读:
    kaggle比赛房价预测
    20192421曾禹涵汇编语言程序设计学习笔记
    Quarkus初体验:动态加载和原生部署
    Windows Android 子系统(WSA)安装
    C#笔记之又谈装箱与拆箱(boxing and unboxing)
    vue前端安全问题学习
    AOP源码解析
    【C#】关于bool?和bool
    【Win8】动画&异步编程
    【WindowsPhone】(二)主题、样式与模版
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2810481.html
Copyright © 2020-2023  润新知