classrefcounted{protected: refcounted () {M_ref_count=0; } Virtual~refcounted () {} Public: voidIncref () {+ +M_ref_count;} voidDesref () {if(--m_ref_count = =0) {Delete This; } }Private: intM_ref_count;}; Template<typename t>classrefptr{ Public: Refptr () {m_ptr=0; } Template<typename u>refptr (U*ptr) {m_ptr=ptr; if(M_PTR) {m_ptr->incref ();} } template<typename u>Refptr (Constrefptr<u>&ptr) {m_ptr=ptr.getrefptr (); if(M_PTR) {m_ptr->incref ();} } ~refptr () {if(m_ptr) {m_ptr-Desref (); M_ptr=0; }} template<typename u>refptr<T>&operator= (u*ptr) { if(M_ptr! =ptr) { if(M_PTR) {m_ptr->desref ();} M_ptr=ptr; if(M_PTR) {m_ptr->incref ();} } return* This; } template<typename u>refptr<T>&operator=(Constrefptr<u>&ptr) { if(M_ptr! =ptr.getrefptr ()) { if(M_PTR) {m_ptr->desref ();} M_ptr=ptr.getrefptr (); if(M_PTR) {m_ptr->incref ();} } return* This; } T*operator()Const{returnm_ptr;} T&operator*()Const{return*m_ptr;} operator BOOL()Const{return(M_ptr! =0); } T* GETREFPTR ()Const{returnm_ptr;}Private: T*m_ptr;}; Template<typename T, TypeName u>BOOL operator==(Constrefptr<t>& A,Constrefptr<u>& b) {return(a.getrefptr () = =b.getrefptr ()); }template<typename T, TypeName u>BOOL operator==(Constrefptr<t>& A,Constu* b) {return(a.getrefptr () = =b); }template<typename T, TypeName u>BOOL operator==(ConstU* A,Constrefptr<t>& b) {return(A = =b.getrefptr ()); }template<typename T, TypeName u>BOOL operator!=(Constrefptr<t>& A,Constrefptr<u>& b) {return(A.getrefptr ()! =b.getrefptr ()); }template<typename T, TypeName u>BOOL operator!=(Constrefptr<t>& A,Constu* b) {return(A.getrefptr ()! =b); }template<typename T, TypeName u>BOOL operator!=(ConstU* A,Constrefptr<t>& b) {return(A! = B.getrefptr ()); }
Smart pointers for C + + support inheritance relationships