一个智能指针的小程序,使用模板函数开发,附带测试程序
代码如下:
///auto ptr
template<typename T>
class AutoPtr
{
struct t_ptr
{
T* __ptr;
int __counter;
t_ptr(T*ptr)
{
__ptr = ptr;
__counter = 1;
};
t_ptr(){__ptr = NULL;__counter = 0;}
~t_ptr(){delete __ptr;}
};
private:
t_ptr* m_ptr;
public:
AutoPtr();
AutoPtr(T* ptr = NULL);
AutoPtr(const AutoPtr& rhs);
AutoPtr<T>& operator=(const AutoPtr<T>& rhs);
T& operator*();
T*operator->();
~AutoPtr();
private:
void _AddRef();
void _DeRef();
};
defination of AutoPtr
//构造函数
template<typename T>
AutoPtr<T>::AutoPtr(T* ptr)
{
m_ptr = new t_ptr(ptr);
}
//构造函数
template<typename T>
AutoPtr<T>::AutoPtr()
{
m_ptr = new t_ptr();
}
//拷贝构造函数
template<typename T>
AutoPtr<T>::AutoPtr(const AutoPtr& rhs):m_ptr(rhs.m_ptr)
{
_AddRef();
}
//赋值操作
template<typename T>
AutoPtr<T>& AutoPtr<T>::operator=(const AutoPtr<T>& rhs)
{
if(m_ptr != rhs.m_ptr)
{
if(NULL != m_ptr)//将要接受新指针,需要将原来的引用计数减掉。
--m_ptr->__counter;
m_ptr = rhs.m_ptr;
_AddRef();
}
}
//析构函数
template<typename T>
AutoPtr<T>::~AutoPtr()
{
_DeRef();
}
/
template<typename T>
T& AutoPtr<T>::operator*()
{
return *m_ptr->__ptr;
}
template<typename T>
T* AutoPtr<T>::operator->()
{
return m_ptr->__ptr;
}
/计数器增减操作//
template<typename T>
void AutoPtr<T>::_AddRef()
{
if(NULL != m_ptr)
++m_ptr->__counter;
}
template<typename T>
void AutoPtr<T>::_DeRef()
{
if(NULL == m_ptr)
return ;
--m_ptr->__counter;
if(m_ptr->__counter <= 0)
delete m_ptr;
}
//test
//testmain.cpp
#include<iostream>
#include "AutoPtr.h"
using namespace std;
class TestClass
{
int m_iCounter;
public:
int Get(){return m_iCounter;}
void Set(int iVal){m_iCounter = iVal;}
};
using namespace std;
int main()
{
AutoPtr<TestClass> ap(new TestClass);
ap->Set(200);
cout<<"ap->Get():"<<ap->Get()<<endl;
AutoPtr<TestClass>ap2 = ap;
cout<<"ap2->Get():"<<ap2->Get()<<endl;
ap2->Set(600);
cout<<"after ap->Get():"<<ap->Get()<<endl;
cout<<"after ap2->Get():"<<ap2->Get()<<endl;
return 0;
}