Gac代码库分析(3)智能指针
2012-12-09 22:01 Clingingboy 阅读(335) 评论(0) 编辑 收藏 举报
主要在于引用计数的使用
代码示例:
template<typename T>
class Ptr
{
template<typename X>
friend class Ptr;
protected:
vint* counter;
T* reference;
void Inc()
{
if(counter)
{
(*counter)++;
}
}
void Dec()
{
if(counter)
{
if(--(*counter)==0)
{
delete counter;
delete reference;
counter=0;
reference=0;
}
}
}
vint* Counter()const
{
return counter;
}
Ptr(vint* _counter, T* _reference)
:counter(_counter)
,reference(_reference)
{
Inc();
}
public:
Ptr()
{
counter=0;
reference=0;
}
Ptr(T* pointer)
{
if(pointer)
{
counter=new vint(1);
reference=pointer;
}
else
{
counter=0;
reference=0;
}
}
Ptr(const Ptr<T>& pointer)
{
counter=pointer.counter;
reference=pointer.reference;
Inc();
}
template<typename C>
Ptr(const Ptr<C>& pointer)
{
T* converted=pointer.Obj();
if(converted)
{
counter=pointer.Counter();
reference=converted;
Inc();
}
else
{
counter=0;
reference=0;
}
}
~Ptr()
{
Dec();
}
template<typename C>
Ptr<C> Cast()const
{
C* converted=dynamic_cast<C*>(reference);
return Ptr<C>((converted?counter:0), converted);
}
Ptr<T>& operator=(T* pointer)
{
Dec();
if(pointer)
{
counter=new vint(1);
reference=pointer;
}
else
{
counter=0;
reference=0;
}
return *this;
}
Ptr<T>& operator=(const Ptr<T>& pointer)
{
if(this!=&pointer)
{
Dec();
counter=pointer.counter;
reference=pointer.reference;
Inc();
}
return *this;
}
template<typename C>
Ptr<T>& operator=(const Ptr<C>& pointer)
{
T* converted=pointer.Obj();
Dec();
if(converted)
{
counter=pointer.Counter();
reference=converted;
Inc();
}
else
{
counter=0;
reference=0;
}
return *this;
}
bool operator==(const T* pointer)const
{
return reference==pointer;
}
bool operator!=(const T* pointer)const
{
return reference!=pointer;
}
bool operator>(const T* pointer)const
{
return reference>pointer;
}
bool operator>=(const T* pointer)const
{
return reference>=pointer;
}
bool operator<(const T* pointer)const
{
return reference<pointer;
}
bool operator<=(const T* pointer)const
{
return reference<=pointer;
}
bool operator==(const Ptr<T>& pointer)const
{
return reference==pointer.reference;
}
bool operator!=(const Ptr<T>& pointer)const
{
return reference!=pointer.reference;
}
bool operator>(const Ptr<T>& pointer)const
{
return reference>pointer.reference;
}
bool operator>=(const Ptr<T>& pointer)const
{
return reference>=pointer.reference;
}
bool operator<(const Ptr<T>& pointer)const
{
return reference<pointer.reference;
}
bool operator<=(const Ptr<T>& pointer)const
{
return reference<=pointer.reference;
}
operator bool()const
{
return reference!=0;
}
T* Obj()const
{
return reference;
}
T* operator->()const
{
return reference;
}
};
1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现