注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

一个自己实现的简单的智能指针模板类[原]  

2013-03-14 16:40:04|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

自己实现的一个智能指针的模板类,附带测试程序

代码如下:

///////////////////////////////////////////////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;
}

  评论这张
 
阅读(468)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018