博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构库——智能指针的实现(上)
阅读量:4624 次
发布时间:2019-06-09

本文共 2245 字,大约阅读时间需要 7 分钟。

1,前面博文面的单链表实现中运用了大量的原生指针,这里能否使用智能指针(SmartPointer)替换单链表(LinkList)中的原生指针?

   1,不能简单的替换,程序会崩溃;

  

2,问题在于:

       1,SmartPointer 的设计方案:

              1,指针生命周期结束时主动释放堆空间;

              2,一片堆空间最多只能由一个指针标识;

                     1,这个就是问题所在,因为在 LinkList 中遍历的时候将多个指针指向同一个元素;

              3,杜绝指针运算和指针比较;

             

3,新的设计方案:

       1,创建新的智能指针:

 

              1,Pointer 是智能指针的抽象父类(模板):

                     1,纯虚析构函数 virtual ~Pointer() = 0;

                            1,因为 Pointer 是抽象父类,需要被继承产生正正的指针;

                     2,重载 operator->();

                     3,重载 operator*();

              2,Pointer 的接口定义:

                    

 

4,Pointer 的实现:

1 #ifndef POINTER_H 2 #define POINTER_H 3  4 #include "Object.h" 5  6 namespace DTLib 7 { 8  9 template 
10 class Pointer : public Object11 {12 protected:13    T* m_pointer;14 15 public:16 Pointer( T* p = NULL )17 {18 m_pointer = p;19    }20 21 T* operator-> () 22 {23 return m_pointer;24    }25 26 T& operator* ()27 {28 return *m_pointer;29    }30 31 const T* operator-> () const // 为了 const 函数调用而准备32 {33 return m_pointer;34    }35 36 const T& operator* () const // 为了 const 函数调用而准备37 {38 return *m_pointer;39    }40 41 bool isNull() const // 做成 const 函数是为了被 const 函数调用42 {43 return ( m_pointer == NULL );44    }45 46 T* get() const // 做成 const 函数是为了被 const 函数调用47 {48 return m_pointer;49    }50 51 };52 53 }

 

6,SmartPointer 的实现(重新架构):

1 #ifndef SMARTPOINTER_H 2 #define SMARTPOINTER_H 3  4 #include "Pointer.h" 5  6 namespace DTLib 7 { 8  9 template 
10 class SmartPointer : public Pointer
11 {12 public:13 SmartPointer(T* p = NULL) : Pointer
(p)14 {15    }16 17 SmartPointer(const SmartPointer
& obj) // 这里为了一片堆空间只能由一个指//针标识;18 {19 this->m_pointer = obj.m_pointer;20 const_cast
&>(obj).m_pointer = NULL; // 去除常量属性、然后置空;21    }22 23 SmartPointer
& operator= (const SmartPointer
& obj)24 {25 if( this != &obj)26 {27 T* p = this->m_pointer; // 改成异常安全的,之前是 delete m_pointer;28 this->m_pointer = obj.m_pointer;29 const_cast
&>(obj).m_pointer = NULL;30 31 delete p;32 }33 34 return *this;35    }36 37 ~SmartPointer() // 必须要,否则这里是纯虚类;38 {39 delete this->m_pointer;40 }41 };42 43 }44 45 #endif // SMARTPOINTER_H

转载于:https://www.cnblogs.com/dishengAndziyu/p/10922660.html

你可能感兴趣的文章
spring mvc 自定义Handlermapping
查看>>
JS验证密码安全级别
查看>>
Cookie是可以覆盖的,如果重复写入同名的Cookie,那么将会覆盖之前的Cookie。
查看>>
Django Models的数据类型
查看>>
博客之初体验-----python初了解
查看>>
jquery.fileupload插件 ie9下不支持上传
查看>>
6.1 HTML5的框架
查看>>
Nginx的500,502,504错误解决方法
查看>>
SAP MM MM17里不能修改物料主数据'Purchasing Value Key'字段值?
查看>>
Revel示例 - 验证
查看>>
怪物,托管玩家的设计基本思路
查看>>
.Net Remoting
查看>>
HTML基础入门
查看>>
生成器和生成器表达式
查看>>
C#中数组、ArrayList和List三者的区别
查看>>
MVC4 WEBAPI(一)使用概述
查看>>
推荐给非互联网主体的用户
查看>>
sublime3 sftp 忽略文件的写法
查看>>
42. Multiply Strings
查看>>
Socket 基于完整CS样式例子(转载)
查看>>