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 |