一點都不智能的智能指針
#include <iostream>
using namespace std;
template<typename T>
class Auto
{
public:
// 避免編譯器報錯,需要顯式類型轉換
explicit Auto(T* data = NULL) : m_data(data) {}
// 轉移拷貝
Auto(Auto<T>& that) : m_data(change(that)) {}
// 轉移賦值
Auto& operator = (Auto<T>& that)
{
if (this != &this)
return release(change(that));
return *this;
}
~Auto(void)
{
delete m_data;
}
T& operator * (void)
{
return *m_data;
}
T const& operator * (void) const
{
return *(const_cast<Auto&>(*this));
}
T* operator -> (void)
{
return m_data;
}
T *const operator ->(void) const
{
return m_data;
}
friend ostream& operator << (ostream& os, Auto const& rhs)
{
return os << rhs.m_data;
}
private:
T* change(Auto<T>& that)
{
T* temp = that.m_data;
that.m_data = NULL;
return temp;
}
Auto& release(T* data)
{
delete m_data;
m_data = data;
return *this;
}
T* m_data;
};
// 特化數組類型的
template<typename T>
class Auto<T[]>
{
public:
explicit Auto(T* data = NULL) : m_data(data) {}
Auto(Auto<T>& that) : m_data(change(that)) {}
Auto& operator = (Auto<T>& that)
{
if (that != *this)
return release(change(that));
return *this;
}
~Auto(void)
{
delete[] m_data;
}
T& operator * (void)
{
return *m_data;
}
T const& operator * (void) const
{
return *(const_cast<Auto&>(*this));
}
T* operator -> (void)
{
return m_data;
}
T *const operator ->(void) const
{
return m_data;
}
friend ostream& operator << (ostream& os, Auto const& rhs)
{
return os << rhs.m_data;
}
private:
T* change(Auto<T>& that)
{
T* temp = that.m_data;
that.m_data = NULL;
return temp;
}
Auto& release(T* data)
{
delete m_data;
m_data = data;
return *this;
}
T* m_data;
};