mec++에 있는 auto_ptr

반응형


template<class T>
class auto_ptr
{
public:
 explicit auto_ptr(T* p = 0);
 
 // 복사 생성자용 멤버 템플릿
 template<class U>
 auto_ptr(auto_ptr<U>& rhs);

 ~auto_ptr();

 // 대입연산자용 멤버 템플릿
 template<class U> auto_ptr<T>& operator=(auto_ptr<U>& rhs); 

 T& operator*() const;
 T* operator->() const;

 T* get() const;   // 현재의 dumb 포인터를 반환
 T* release();   // 현재의 dumb 포인터에 대한 소유권을 박탈하고 그 포인터값을 반환

 void reset(T* p=0);  // 가지고 있는 포인터를 삭제

private:
 T* pointee;

 template<class U> friend class auto_ptr;// auto_ptr 클래스끼리 서로의 프렌드가 되도록.
};

/////////////////////// implement ///////////////////////
template<class T>
inline auto_ptr<T>::auto_ptr(T* p) : pointee(p) // 생성자
{}

template<class T>
template<class U>
inline auto_ptr<T>::auto_ptr(auto_ptr<U>& rhs) : pointee(rhs.release())
{}

template<class T>
inline auto_ptr<T>::~auto_ptr()     // 소멸자
{ delete pointee; }

template<class T>
template<class U>
inline auto_ptr<T>& auto_ptr<T>::operator=(auto_ptr<U>& rhs)
{
 if(this != &rhs)
  reset(rhs.release()); // 가지고 있던 포인터 삭제

 return *this;
}

template<class T>
inline T& auto_ptr<T>::operator* () const
{
 return *pointee;
}

template<class T>
inline T* auto_ptr<T>::operator-> () const
{
 return pointee;;
}

template<class T>
inline T* auto_ptr<T>::get() const
{
 return pointee;;
}

template<class T>
inline T* auto_ptr<T>::release()
{
 T* oldPointee = pointee;
 pointee = NULL;
 return oldPointee;
}

template<class T>
inline void auto_ptr<T>::reset(T* p)
{
 if(pointee != p)
 {
  delete pointee;
  pointee = p;
 }
}


int _tmain(int argc, _TCHAR* argv[])
{
 float f = 1.5f;
 int i = 1;
 auto_ptr<float> apf(&f);
 //auto_ptr<int> api(apf);
 return 0;
}

'Study > C++' 카테고리의 다른 글

__int8, __int16, __int32, __int64  (0) 2010.05.30
volatile  (0) 2010.05.29
none MFC에서 memory leak난 부분 찾기  (0) 2010.05.28
__FILE__, __FUNCTION__, __LINE__  (0) 2010.03.25
c++ 생각하기 5.  (0) 2010.03.22
TAGS.

Comments