#include <iostream>
#include <string>
using namespace std;
namespace MySmartPtr
{
class PtrCount;
template<class T>
class AutoPtr;
};
class PtrCount
{
private:
int m_iptrCount;
public:
PtrCount(int iNum = 0){m_iptrCount = iNum;}
~PtrCount(){}
int addRef(){return (++m_iptrCount);}
int release(){return(--m_iptrCount);}
};
template<class T>
class AutoPtr
{
private:
T * m_RawPtr;
PtrCount *m_ptrCount ;
public:
AutoPtr(T *ptr = NULL){m_RawPtr = ptr;m_ptrCount = new PtrCount(1);}
~AutoPtr(){if(m_ptrCount->release() == 0) {delete m_RawPtr;delete m_ptrCount;}}
T *operator-> (void) { return m_RawPtr;}
T& operator *(void) { return *m_RawPtr;}
AutoPtr & operator = (const AutoPtr<T> & pAutoPtr)
{
if(m_ptrCount->release() == 0) {delete m_RawPtr;delete m_ptrCount;}
m_RawPtr = pAutoPtr.m_RawPtr;
m_ptrCount = pAutoPtr.m_ptrCount;
if (m_ptrCount) m_ptrCount->addRef();
return *this;
}
};
int main()
{
AutoPtr<string> strAutoPtr(new string("智能指针测试"));
cout<<(*strAutoPtr)<<endl;
AutoPtr<string> strAutoPtr2(new string("复制测试指针"));
cout<<(*strAutoPtr2)<<endl;
strAutoPtr = strAutoPtr2;
cout<<(*strAutoPtr)<<endl;
return 0;
}