再论智能指针(上)

Posted zhaobinyouth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再论智能指针(上)相关的知识,希望对你有一定的参考价值。

0.引言:

目的:使用智能指针替代LinkList中的原生的指针,

限制:但是我们的智能指针设定了只能单个指针指向某一片堆空间

 

1. 智能指针的继承层次结构

技术分享图片

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

  ①纯虚析构函数:virtual ~Pointer()=0;

  ②重载operator->()

  ③重载operator*()

 (2)类的声明

 

 1 template <typename T>
 2 class Pointer : public Object
 3 {
 4 protected:
 5     T* m_pointer;
 6 public:
 7     Pointer(T* p = NULL);
 8     T* operator->();
 9     T& operator*();
10     bool isNull();
11     T* get();
12    virtual ~Pointer()=0; 
13 };

 

2. SmartPointer的问题

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

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

(3)杜绝指针运算和指针比较

 

 3.【编程实验】

智能指针的新方案

//Pointer.h

 

#ifndef _POINTER_H_
#define _POINTER_H_
#include "Object.h"

namespace DataStructureLib
{
    template <typename T>
    class Pointer : public Object//Pointer不需实现析构函数 Object是析构函数本身是纯虚函数!
    {
    protected:
        T* m_pointer;
    public:
        Pointer(T* p = NULL)
        {
            m_pointer=p;
        }

        T* operator->()
        {
            return m_pointer;
        }    
        T& operator*()
        {
            return *m_pointer;
        }
        
        bool isNull()
        {
            return (m_pointer==NULL);
        }
    
        T* get()
        {
            return *m_pointer;
        }
        //virtual ~Pointer()=0;//Pointe可以省略这个析构函数 Object是析构函数本身是纯虚函数!,如果这里不提供析构函数的实现(编译器默认会有析构函数),这个Pointer类一直是个纯虚类
    };
}
#endif

//SmartPointer.h

 1 #ifndef _SMARTPOINTER_H_
 2 #define _SMARTPOINTER_H_
 3 
 4 #include "Pointer.h"
 5 
 6 namespace DataStructureLib {
 7 
 8     //智能指针
 9     template<typename T>
10     class SmartPointer : public Pointer<T>
11     {
12     public:
13         //构造函数  直接调用父类的构造函数
14         SmartPointer(T* p = NULL):Pointer(p)
15         {
16 
17         }
18 
19          //拷贝构造函数
20         SmartPointer(const SmartPointer<T>& obj)
21         {
22             this->m_pointer=obj->m_pointer;
23 
24             //所有权转移,使得同一时刻只能由一个指针指向堆空间
25             const_cast<SmartPointer<T> &>(obj).m_pointer=NULL;
26         }
27 
28         SmartPointer<T>& operator=(SmartPointer<T>& obj)
29         {
30             if (this!=&obj)
31             {
32                 T* p=this->m_pointer;
33                 this->m_pointer=obj.m_pointer;
34                 //所有权转移
35                 const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
36                 delete p;
37             }
38             return *this;
39         }
40         
41         ~SmartPointer()
42         {
43             delete m_pointer;
44         }
45     };
46 }
47 
48 
49 #endif

测试代码:

 1 #include<iostream>
 2 #include "object.h"
 3 #include "SeqList.h"
 4 #include "LinkList.h"
 5 #include "SmartPointer.h"
 6 using namespace std;
 7 using namespace DataStructureLib;
 8 
 9 class Test : public Object
10 {
11 public:
12     Test()
13     {
14         cout << "Test()" << endl;
15     }
16 
17     ~Test()
18     {
19         cout <<"~Test()" << endl;
20     }
21 };
22 int main(int argc, char const *argv[])
23 {
24     SmartPointer<Test> sp = new Test();
25     SmartPointer<Test> spn;
26     spn = sp;
27     
28     //system("pause"); 
29     return 0;
30 }

结果

技术分享图片

 

以上是关于再论智能指针(上)的主要内容,如果未能解决你的问题,请参考以下文章

第二十七课 再论智能指针(上)

再论智能指针(下)

第二十八课 再论智能指针(下)

第28课 再论智能指针(下)

再论函数指针函数指针数组

智能指针是否线程安全