#ifndef _SMART_PTR_H#define _SMART_PTR_Htemplate <class T>class CSmartPtr{private:template <class Y>class CSmartPtrRef{private:Y * m_pY;public:CSmartPtrRef(Y * p):m_pY(p){}Y * get() const throw();};T * m_pT;public:/* 构造函数 */explicit CSmartPtr(T * p = NULL);/* 拷贝构造函数 */CSmartPtr(CSmartPtr & x);/* 支持临时对象转换为CSmartPtrRef类型能调用CSmartPtr拷贝构造函数 *//* 解决临时对象不能绑定到非常引用 */CSmartPtr(const CSmartPtrRef<T> & x);/* 赋值运算符重载 */CSmartPtr<T> & operator = (CSmartPtr<T> & s) throw();/* 支持临时对象转换为CSmartPtrRef类型后能赋值给CSmartPtr *//* 解决临时对象不能绑定到非常引用 */template <class Y>CSmartPtr<T> & operator = (CSmartPtrRef<Y> & s) throw();/* 不同类型的智能指针相互间可以赋值 */template <class Y>CSmartPtr<T> & operator = (CSmartPtr<Y> & s) throw();/* 用户自定义类型转化 *//* 解决临时对象不能绑定到非常引用 */template <class Z>operator CSmartPtrRef<Z> () throw();/* 取得智能指针内部指针值 */T * Get() const throw();/* 重置智能指针指向的对象 */void Reset(T * p) throw();/* 取得智能指针内部指针值,并且智能指针放弃拥有权 */T * Release() throw();/* 解析地址(*)运算符重载 */T & operator * () const throw();/* 成员访问(->)运算符重载 */T * operator -> () const throw();/* 析构函数 */~CSmartPtr();};/* 构造函数 */template <class T>CSmartPtr<T>::CSmartPtr(T * p):m_pT(p){}/* 支持临时对象转换为CSmartPtrRef类型能调用CSmartPtr拷贝构造函数 *//* 解决临时对象不能绑定到非常引用 */template <class T>CSmartPtr<T>::CSmartPtr(const CSmartPtrRef<T> & x){m_pT = x.m_pY;}/* 用户自定义类型转化 *//* 解决临时对象不能绑定到非常引用 */template <class T>template <class Z>CSmartPtr<T>::operator CSmartPtrRef<Z> () throw(){return CSmartPtrRef<Y>(Release());}/* 内嵌模板类CSmartPtrRef的成员函数get */template <class T>template <class Y>Y * CSmartPtr<T>::CSmartPtrRef<Y>::get() const throw(){return m_pY;}/* 拷贝构造函数 */template <class T>CSmartPtr<T>::CSmartPtr(CSmartPtr & x){m_pT = x.Release();}/* 赋值运算符重载 */template <class T>CSmartPtr<T> & CSmartPtr<T>::operator = (CSmartPtr<T> & s) throw(){if (this != &s){delete m_pT;m_pT = s.Release();}return *this;}/* 支持临时对象转换为CSmartPtrRef类型后能赋值给CSmartPtr *//* 解决临时对象不能绑定到非常引用 */template <class T>template <class Y>CSmartPtr<T> & CSmartPtr<T>::operator = (CSmartPtrRef<Y> & s) throw(){if (s.get() != m_pT){delete m_pT;m_pT = s.get();}return *this;}/* 不同类型的智能指针相互间可以赋值 */template <class T>template <class Y>CSmartPtr<T> & CSmartPtr<T>::operator = (CSmartPtr<Y> & s) throw(){if (s.m_pT != m_pT){delete m_pT;m_pT = s.Release();}return *this;}/* 取得智能指针内部指针值 */template <class T>T * CSmartPtr<T>::Get() const throw(){return m_pT;}/* 重置智能指针指向的对象 */template <class T>void CSmartPtr<T>::Reset(T * p) throw(){if (p != Get()){delete m_pT;m_pT = p;}}/* 取得智能指针内部指针值,并且智能指针放弃拥有权 */template <class T>T * CSmartPtr<T>::Release() throw(){T * p = m_pT;m_pT = NULL;return p;}/* 解析地址(*)运算符重载 */template <class T>T & CSmartPtr<T>::operator * () const throw(){return *m_pT;}/* 成员访问(->)运算符重载 */template <class T>T * CSmartPtr<T>::operator -> () const throw(){return m_pT;}/* 析构函数 */template <class T>CSmartPtr<T>::~CSmartPtr(){delete m_pT;m_pT = NULL;}#endif#ifndef _SMART_PTR_H#define _SMART_PTR_Htemplat 你的当前访问异常,请进行认证后继续阅读剩余内容。 提交