下面是C++模板實現的智能指標
/***************************************************************<br />* NAME : CSmartPtr.h<br />* FUNCTION : 智能指標<br />* PROGRAMMED : Ming_zhang<br />* DATE(ORG) : Jun 02 2010<br />* PROJECT :<br />* OS : Windows XP<br />* HISTORY :<br />* ID --- DATE -----------NOTE-------------------------------<br />* 00<br />***************************************************************/</p><p>#ifndef _CSMARTPTR_H_EFBAB248_67C2_4C3B_A146_FC03095EC3BA<br />#define _CSMARTPTR_H_EFBAB248_67C2_4C3B_A146_FC03095EC3BA</p><p>namespace stm<br />{</p><p>template<typename T><br />class CSmartPtr<br />{<br />public:<br />/*Constructor*/<br />CSmartPtr();<br />CSmartPtr(const T * ptr);<br />CSmartPtr(const CSmartPtr<T> & ptr);<br />/*Assignment Operators*/<br />CSmartPtr<T> &operator =(T*ptr) ;<br />CSmartPtr<T> &operator =(const CSmartPtr<T>& ptr) ;</p><p>T* operator ->() throw(runtime_error);<br />T& operator *() throw(runtime_error);<br />/*const version*/<br />T* const operator ->()const throw(runtime_error);<br />const T& operator *()const throw(runtime_error);<br />/*Destructors*/<br />~CSmartPtr();<br />private:<br />int * _ptrCount;<br />T * _ptr;<br />};</p><p>template<typename T><br />CSmartPtr<T>::CSmartPtr():_ptr(0),_ptrCount(0)<br />{<br />}</p><p>template<typename T><br />CSmartPtr<T>::CSmartPtr(const T * ptr):_ptr(ptr)<br />{<br />if(_ptr!=NULL)/*防止參數為空白*/<br />{<br />_ptrCount = new int(0);<br />(*_ptrCount)++;<br />}<br />}</p><p>template<typename T><br />CSmartPtr<T>::CSmartPtr(const CSmartPtr<T> & ptr):_ptr(0),_ptrCount(0)<br />{<br />if(ptr._ptr!=0)/*防止參數為空白指標*/<br />{<br />this->_ptr =ptr._ptr;<br />this->_ptrCount = ptr._ptrCount;<br />(*_ptrCount)++;<br />}<br />}<br />template<typename T><br />CSmartPtr<T>::~CSmartPtr()<br />{<br />if(_ptr!=0)<br />{<br />(*_ptrCount)--;<br />if(*_ptrCount==0)<br />{<br />delete _ptr;<br />delete _ptrCount;<br />}<br />}<br />}</p><p>template<typename T><br />CSmartPtr<T> & CSmartPtr<T>::operator =( T * ptr)<br />{<br />if(ptr != this->_ptr)<br />{//防止自我賦值<br />if(_ptr==NULL)<br />{//自己為空白<br />if(ptr!=NULL)//參數不為空白<br />{<br />_ptrCount = new int(0);<br />(*_ptrCount)++;<br />_ptr = ptr;<br />}<br />else//參數為空白<br />{<br />}<br />}<br />else<br />{//自己不為空白<br />(*_ptrCount)--;<br />if(*_ptrCount==0)<br />{/*釋放 _ptr */<br />delete _ptr;<br />}<br />_ptr = ptr;<br />*_ptrCount = 1;<br />}<br />}<br />return *this;<br />}</p><p>template<typename T><br />CSmartPtr<T> & CSmartPtr<T>::operator =(const CSmartPtr<T> &ptr)<br />{<br />if(ptr._ptr!=_ptr)<br />{//防止自我賦值<br />if(ptr._ptr==0)<br />{// 參數為空白<br />if(_ptr!=0)<br />{//自己不為空白<br />(*_ptrCount)--;<br />if(*_ptrCount==0)<br />{//釋放自己原來指向的空間<br />delete _ptr;<br />delete _ptrCount;<br />}<br />_ptr = ptr._ptr;<br />_ptrCount=ptr._ptrCount;<br />}<br />else<br />{//自己為空白 什麼都不做<br />}<br />}<br />else<br />{// 參數不為空白<br />if(_ptr!=0)<br />{//自已不為空白<br />(*_ptrCount)--;<br />if(*_ptrCount==0)<br />{//釋放自己原來指向的空間<br />delete _ptr;<br />delete _ptrCount;<br />}<br />}<br />_ptr = ptr._ptr;<br />_ptrCount = ptr._ptrCount;<br />(*_ptrCount)++;<br />}<br />}<br />return *this;<br />}</p><p>template<typename T><br />T* CSmartPtr<T>::operator ->() throw(runtime_error)<br />{<br />if(_ptr!=0)<br />return _ptr;<br />throw runtime_error("access through NULL pointer");<br />}</p><p>template<typename T><br />T& CSmartPtr<T>::operator *() throw(runtime_error)<br />{<br />if(_ptr!=0)<br />return *_ptr;<br />throw std::runtime_error("dereference of NULL pointer");<br />}</p><p>template<typename T><br />T* const CSmartPtr<T>::operator ->()const throw(runtime_error)<br />{<br />if(_ptr!=0)<br />return _ptr;<br />throw runtime_error("access through NULL pointer");<br />}<br />template<typename T><br />const T& CSmartPtr<T>::operator *()const throw(runtime_error)<br />{<br />if(_ptr!=0)<br />return *_ptr;<br />throw std::runtime_error("dereference of NULL pointer");<br />}</p><p>}//namespace stm<br />#endif //_CSMARTPTR_H_EFBAB248_67C2_4C3B_A146_FC03095EC3BA