`
vearne
  • 浏览: 18288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

智能指针的简易实现

阅读更多

 

#include <iostream>
using namespace std;
class smart_count{
private:
	int use_count;
public:
	smart_count(int c=0):use_count(c){
	
	}
	~smart_count(){}
	int addref(){
		return ++use_count;
	}
	int release(){
		return --use_count;
	}
};
template<class T>
class smart_ptr{
private:
	T* p;
	smart_count* u;
public:
	smart_ptr(T* tp):p(tp),u(new smart_count(1)){
	}
	smart_ptr():p(NULL),u(NULL){}
	~smart_ptr(){
		if(p&&u->release()<=0){
			delete p;
			delete u;
			p = NULL;
		}
	}
	smart_ptr(smart_ptr<T>& sp){
		p = sp.p;
		u = sp.u;
		if(u){
			u->addref();
		}
	}
	smart_ptr<T>& operator=(smart_ptr<T>& t){
		if(p&&u->release()<=0){
			delete p;
			delete u;
		}
		p = t.p;
		u = t.u;
		if(u){
			u->addref();
		}
	}
	T* operator->(){//这段代码让我困惑,这样就能调用p的函数了?
		return p;
	} 
	T& operator*(){
		return *p;
	}
	T* get(){
		return p;
	}
	void reset(T* t){
		if(p&&u->release()<=0){
			delete p;
			delete u;
		}
		p = t;
		if(p){
			u = new smart_count(1);
		}else{
			u = NULL;
		}
	
	}
	
};
class Car{
private:
	int data;
public:
	Car(int d):data(d){
		cout<<"constructor car"<<endl;
	}
	~Car(){
		cout<<"destructor car"<<endl;
	}
	void f(int a=0){
		cout<<"ok = "<<a+data<<endl;
	}
};
int main(){
	Car* cp = new Car(1);
	smart_ptr<Car> sp(cp);
	sp->f(2);
	(*sp).f(2);

}
分享到:
评论

相关推荐

    C++新特性18-智能指针的简易实现及添加模板思维导图

    博文:C++新特性18_智能指针的简易实现及添加模板配套思维导图

    基于51单片机简易示波器设计OLED显示(包含源程序原理图PCB)

    基于51单片机简易示波器设计OLED显示(包含源程序原理图PCB)

    基于C++实现的HTTP服务器改进版源码+项目使用说明+详细注释.zip

    **②基于双管道的简易CGI实现**:修改stdin的定向为管道写端,实现终端对客户端的直接输入和对服务端的发送;\ **6)改进方向**:待进行压力测试并提高抗压性能、可处理的HTTP请求较为简单(数据体的处理还待增加...

    操作系统(内存管理)

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解...

    OpenSceneGraph三维渲染引擎设计与实践

    3.3.3 范例:智能指针的使用 52 第4章 场景的组织结构 55 4.1 节点的定义与种类 56 4.1.1 场景图形bvh树 56 4.1.2 节点的父子关系 58 4.1.3 叶节点与组节点 59 4.1.4 节点的功能与分类 62 4.2 节点的访问 65 ...

    51单片机100例程序设计

    【实例63】简易智能电动车... 145 【实例64】洗衣机控制器... 149 第九章.... 152 【实例65】串行A/D转换... 152 【实例66】并行A/D转换... 153 【实例67】模拟比较器实现A/D转换... 154 【实例68】串行D/A转换... ...

    现代C++编程:从基础到实战项目全覆盖.docx

    除此之外,教程还包含多个实战项目,如简易的游戏开发、数据结构库的实现和一个小型的数据库系统,旨在通过实践加深对C++编程的理解。无论你是编程新手还是希望提升现有C++技能的开发者,本教程都将是你不可多得的...

    内存管理内存管理内存管理

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要...

    单片机电子时钟设计.doc

    由于具有上述优点,在我国,单片机已广泛 地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体 化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业 设计...

    [原创]自己工作中常用的模板库,简化你的工作

    ★ 当把"智能指针/stl迭代器/C指针/前三者嵌套"都视为指针时,其内的最终值(非指针值)是一致的,在模板函数中,某些场景需要取得其最终的非指针值。 应用场景:转发模板函数,如 template&lt;typename T&gt; void ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.1.5 伴随结构的智能感知帮助 298 7.1.6 RECT结构 299 7.1.7 使用指针处理结构 300 7.2 数据类型、对象、类和实例 301 7.2.1 类的起源 303 7.2.2 类的操作 303 7.2.3 术语 303 7.3 理解类 304 7.3.1 定义...

    机器人编程语言python-10大热门机器人编程语言,你掌握了哪种?.pdf

    帕斯卡尔旨在⿎励良好的编程习惯⼩号,并介绍构造,如指针,它⼀个很好的"敲门砖",从普通版使⼀个 更复杂的语⾔。这⼏天,这两种语⾔都有点过时,有利于"⽇常使⽤"。但是,如果要进⾏⼤量的低级编码,或者想要熟悉...

    C#程序开发范例宝典(第2版).part13

    实例093 程序运行时智能增减控件 134 实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 ...

    C#程序开发范例宝典(第2版).part08

    实例093 程序运行时智能增减控件 134 实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 ...

    C#程序开发范例宝典(第2版).part02

    实例093 程序运行时智能增减控件 134 实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 ...

    C#程序开发范例宝典(第2版).part12

    实例093 程序运行时智能增减控件 134 实例094 多控件的焦点循环移动 136 实例095 动态创建控件 138 实例096 在Button按钮上绘图 138 2.11 焦点变换与输入控制 140 实例097 按回车键焦点在控件中移动的录入窗口 ...

Global site tag (gtag.js) - Google Analytics