00001 #ifndef AUTOPTR_H 00002 #define AUTOPTR_H 00003 00004 template<typename T> class AutoPtr 00005 { 00006 public: 00007 explicit AutoPtr (T* const p = 0) : 00008 p_(p) 00009 { 00010 } 00011 00012 ~AutoPtr () 00013 { 00014 if (p_) 00015 delete p_; 00016 } 00017 00018 void deallocate () 00019 { 00020 *this = 0; 00021 } 00022 00023 T* release () 00024 { 00025 T* const p = p_; 00026 p_ = 0; 00027 return p; 00028 } 00029 00030 void operator = (T* const p) 00031 { 00032 if (p_) 00033 delete p_; 00034 p_ = p; 00035 } 00036 00037 T* operator -> () const 00038 { 00039 return p_; 00040 } 00041 00042 operator T* () const 00043 { 00044 return p_; 00045 } 00046 00047 operator bool () const 00048 { 00049 return p_; 00050 } 00051 00052 private: 00053 T* p_; 00054 00055 AutoPtr (const AutoPtr&); /* no copy */ 00056 void operator = (AutoPtr&); /* no assignment */ 00057 }; 00058 00059 #endif