C++标准库中简单智能指针auto_ptr的模仿实现源码

#ifndef _SMART_PTR_H #define _SMART_PTR_H template <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

2009-03-06

10:29:35

深圳

你可能感兴趣的:(C++,null,delete,Class)