• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Error

            C++博客 首頁 新隨筆 聯系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
            之前自己設計Ref類型遇到new出來的地址,和Ref的this指針一致的情況,soui的這套做法一定程度避免了
            如果有普通的單根繼承直接使用: public 
            TObjRefImpl<IRef>
            如果是多根繼承可以指定析構類型 :public TObjRefImpl2<TDeleteType>
            但是多重繼承兩個Ref類還是沒有解決,原則上應該勁量不再非接口是上使用多重繼承


              1
             template<class T>
              2 class TObjRefImpl :  public T
              3 {
              4 public:
              5     TObjRefImpl():m_cRef(1)
              6     {
              7     }
              8 
              9     virtual ~TObjRefImpl(){
             10     }
             11 
             12     //!添加引用
             13     /*!
             14     */
             15     virtual long AddRef()
             16     {
             17         return InterlockedIncrement(&m_cRef);
             18     }
             19 
             20     //!釋放引用
             21     /*!
             22     */
             23     virtual long Release()
             24     {
             25         long lRet = InterlockedDecrement(&m_cRef);
             26         if(lRet==0)
             27         {
             28             OnFinalRelease();
             29         }
             30         return lRet;
             31     }
             32 
             33     //!釋放對象
             34     /*!
             35     */
             36     virtual void OnFinalRelease()
             37     {
             38         delete this;
             39     }
             40 protected:
             41     volatile LONG m_cRef;
             42 };
             43 
             44 template<class T,class T2>
             45 class TObjRefImpl2 :  public TObjRefImpl<T>
             46 {
             47 public:
             48     virtual void OnFinalRelease()
             49     {
             50         delete static_cast<T2*>(this);
             51     }
             52 };
             53 
             54 //CAutoRefPtr provides the basis for all other smart pointers
             55 template <class T>
             56 class CAutoRefPtr
             57 {
             58 public:
             59     CAutoRefPtr() throw()
             60     {
             61         p = NULL;
             62     }
             63     CAutoRefPtr(_In_ int nNull) throw()
             64     {
             65         (void)nNull;
             66         p = NULL;
             67     }
             68     CAutoRefPtr(_In_opt_ T* lp) throw()
             69     {
             70         p = lp;
             71         if (p != NULL)
             72         {
             73             p->AddRef();
             74         }
             75     }
             76 
             77     CAutoRefPtr(const CAutoRefPtr & src) throw()
             78     {
             79         p=src.p;
             80         if(p)
             81         {
             82             p->AddRef();
             83         }
             84     }
             85 
             86     ~CAutoRefPtr() throw()
             87     {
             88         if (p)
             89         {
             90             p->Release();
             91         }
             92     }
             93 
             94     T* operator->() const throw()
             95     {
             96         return p;
             97     }
             98 
             99     operator T*() const throw()
            100     {
            101         return p;
            102     }
            103     T& operator*() const
            104     {
            105         return *p;
            106     }
            107     //The assert on operator& usually indicates a bug.  If this is really
            108     //what is needed, however, take the address of the p member explicitly.
            109     T** operator&() throw()
            110     {
            111         SASSERT(p==NULL);
            112         return &p;
            113     }
            114     bool operator!() const throw()
            115     {
            116         return (p == NULL);
            117     }
            118     bool operator<(_In_opt_ T* pT) const throw()
            119     {
            120         return p < pT;
            121     }
            122     bool operator!=(_In_opt_ T* pT) const
            123     {
            124         return !operator==(pT);
            125     }
            126     bool operator==(_In_opt_ T* pT) const throw()
            127     {
            128         return p == pT;
            129     }
            130 
            131     T* operator=(_In_opt_ T* lp) throw()
            132     {
            133         if(*this!=lp)
            134         {
            135             if(p)
            136             {
            137                 p->Release();
            138             }
            139             p=lp;
            140             if(p)
            141             {
            142                 p->AddRef();
            143             }
            144         }
            145         return *this;
            146     }
            147 
            148     T* operator=(_In_ const CAutoRefPtr<T>& lp) throw()
            149     {
            150         if(*this!=lp)
            151         {
            152             if(p)
            153             {
            154                 p->Release();
            155             }
            156             p=lp;
            157             if(p)
            158             {
            159                 p->AddRef();
            160             }
            161         }
            162         return *this;    
            163     }
            164 
            165     // Release the interface and set to NULL
            166     void Release() throw()
            167     {
            168         T* pTemp = p;
            169         if (pTemp)
            170         {
            171             p = NULL;
            172             pTemp->Release();
            173         }
            174     }
            175 
            176     // Attach to an existing interface (does not AddRef)
            177     void Attach(_In_opt_ T* p2) throw()
            178     {
            179         if (p)
            180         {
            181             p->Release();
            182         }
            183         p = p2;
            184     }
            185     // Detach the interface (does not Release)
            186     T* Detach() throw()
            187     {
            188         T* pt = p;
            189         p = NULL;
            190         return pt;
            191     }
            192     HRESULT CopyTo(_Deref_out_opt_ T** ppT) throw()
            193     {
            194         if (ppT == NULL)
            195             return E_POINTER;
            196         *ppT = p;
            197         if (p)
            198         {
            199             p->AddRef();
            200         }
            201         return S_OK;
            202     }
            203 
            204 protected:
            205     T* p;
            206 };
            struct IObjRef
            {
                virtual long AddRef() = 0;

                virtual long Release() = 0;
                
                virtual void OnFinalRelease() =0;
            };


            posted on 2015-05-14 10:07 Enic 閱讀(325) 評論(0)  編輯 收藏 引用 所屬分類: 從零開始寫棋牌游戲平臺
            久久久久亚洲AV片无码下载蜜桃| 国产精品亚洲综合专区片高清久久久 | 久久亚洲欧美日本精品| 精品久久久久久无码专区| 久久99国产精品久久| 久久精品18| 韩国免费A级毛片久久| 日韩一区二区三区视频久久| 人人狠狠综合久久88成人| 日韩一区二区久久久久久 | 伊人久久综在合线亚洲2019| 久久久久久午夜精品| 99久久久精品| 中文字幕久久波多野结衣av| 国产精品内射久久久久欢欢| 久久久久se色偷偷亚洲精品av | 日日噜噜夜夜狠狠久久丁香五月| 国产成人久久精品二区三区| 久久婷婷成人综合色综合| 欧美一级久久久久久久大片| 久久久久一区二区三区| 五月丁香综合激情六月久久| 久久亚洲AV无码西西人体| 91精品国产高清久久久久久国产嫩草| 漂亮人妻被中出中文字幕久久| 亚洲一本综合久久| 久久97精品久久久久久久不卡| 精品国产99久久久久久麻豆| 久久亚洲国产成人影院| 色婷婷噜噜久久国产精品12p| 99久久www免费人成精品 | 欧美一级久久久久久久大| 国产精品无码久久久久| 97精品国产97久久久久久免费| 777米奇久久最新地址| 亚洲国产精品无码久久98| 色播久久人人爽人人爽人人片AV| 久久福利资源国产精品999| 亚洲精品无码专区久久同性男| 亚洲精品国产第一综合99久久| 亚洲欧美另类日本久久国产真实乱对白|