www.pudn.com > calc5.zip > auto_ptr.h
#if !defined AUTO_PTR_H #define AUTO_PTR_H //------------------------------------ // auto_ptr // This file is for reference only // (c) Bartosz Milewski, 1998 //------------------------------------ templateclass auto_ptr { template struct auto_ptr_ref { auto_ptr & _ap; auto_ptr_ref (auto_ptr & p) : _ap (p) {} }; public: typedef T element_type; explicit auto_ptr (T * p = 0) : _p (p) {} // "transfer" constructor auto_ptr (auto_ptr & pSrc) { _p = pSrc._p; pSrc._p = 0; } auto_ptr & operator= (auto_ptr & pSrc) { if (this != &pSrc) { _p = pSrc._p; pSrc._p = 0; } return *this; } // "transfer" from derived class template auto_ptr (auto_ptr & pSrc) { _p = pSrc.release (); } // assignment of derived class template auto_ptr & operator= (auto_ptr & pSrc) { if (this != &pSrc) _p = pSrc.release (); return *this; } ~auto_ptr () { delete _p; } T & operator* () const { return *_p; } T * operator-> () const { return _p; } T * get () const { return _p; } T * release () { T * tmp = _p; _p = 0; return tmp; } void reset (T * p = 0) { if (p != _p) { delete _p; _p = p; } } auto_ptr (auto_ptr_ref apr) : _p (apr._ap.release ()) {} template operator auto_ptr_ref () { return auto_ptr_ref (*this); } template operator auto_ptr () { return auto_ptr (release ()); } private: T * _p; }; #endif