第61课 智能指针类模板

智能指针的意义:

STL中的智能指针:

auto_ptr使用示例:

 1 #include <iostream>
 2 #include <string>
 3 #include <memory>
 4 
 5 using namespace std;
 6 
 7 class Test
 8 {
 9     string m_name;
10 public:
11     Test(const char* name)
12     {
13         cout << "Hello, " << name << "." << endl;
14         
15         m_name = name;
16     }
17     
18     void print()
19     {
20         cout << "I'm " << m_name << "." << endl;
21     }
22     
23     ~Test()
24     {
25         cout << "Goodbye, " << m_name << "." << endl;
26     }
27 };
28 
29 int main()
30 {
31     auto_ptr<Test> pt(new Test("D.T.Software"));
32     
33     cout << "pt = " << pt.get() << endl;
34     
35     pt->print();
36     
37     cout << endl;
38     
39     auto_ptr<Test> pt1(pt);
40     
41     cout << "pt = " << pt.get() << endl;
42     cout << "pt1 = " << pt1.get() << endl;
43     
44     pt1->print();
45     
46     return 0;
47 }

运行结果如下:

STL中其它的智能指针:

Qt中的智能指针:

Qt智能指针示例:

 1 #include <QPointer>
 2 #include <QSharedPointer>
 3 #include <QDebug>
 4 
 5 class Test : public QObject
 6 {
 7     QString m_name;
 8 public:
 9     Test(const char* name)
10     {
11         qDebug() << "Hello, " << name << ".";
12 
13         m_name = name;
14     }
15 
16     void print()
17     {
18         qDebug() << "I'm " << m_name << ".";
19     }
20 
21     ~Test()
22     {
23         qDebug() << "Goodbye, " << m_name << ".";
24     }
25 };
26 
27 int main()
28 {
29     QPointer<Test> pt(new Test("D.T.Software"));
30     QPointer<Test> pt1(pt);
31     QPointer<Test> pt2(pt);
32 
33     pt->print();
34     pt1->print();
35     pt2->print();
36 
37     delete pt;
38 
39     qDebug() << "pt = " << pt;
40     qDebug() << "pt1 = " << pt1;
41     qDebug() << "pt2 = " << pt2;
42 
43     qDebug() << endl;
44 
45     QSharedPointer<Test> spt(new Test("Delphi Tang"));
46     QSharedPointer<Test> spt1(spt);
47     QSharedPointer<Test> spt2(spt);
48 
49     spt->print();
50     spt1->print();
51     spt2->print();
52 
53     return 0;
54 }

运行结果如下:

Qt中的其它智能指针:

 智能指针类模板实现:

 1 #ifndef _SMARTPOINTER_H_
 2 #define _SMARTPOINTER_H_
 3 
 4 template
 5 < typename T >
 6 class SmartPointer
 7 {
 8     T* mp;
 9 public:
10     SmartPointer(T* p = NULL)
11     {
12         mp = p;
13     }
14     
15     SmartPointer(const SmartPointer<T>& obj)
16     {
17         mp = obj.mp;
18         const_cast<SmartPointer<T>&>(obj).mp = NULL;
19     }
20     
21     SmartPointer<T>& operator = (const SmartPointer<T>& obj)
22     {
23         if( this != &obj )
24         {
25             delete mp;
26             mp = obj.mp;
27             const_cast<SmartPointer<T>&>(obj).mp = NULL;
28         }
29         
30         return *this;
31     }
32     
33     T* operator -> ()
34     {
35         return mp;
36     }
37     
38     T& operator * ()
39     {
40         return *mp;
41     }
42     
43     bool isNull()
44     {
45         return (mp == NULL);
46     }
47     
48     T* get()
49     {
50         return mp;
51     }
52     
53     ~SmartPointer()
54     {
55         delete mp;
56     }
57 };
58 
59 #endif

测试程序:

 1 #include <iostream>
 2 #include <string>
 3 #include "SmartPointer.h"
 4 
 5 using namespace std;
 6 
 7 class Test
 8 {
 9     string m_name;
10 public:
11     Test(const char* name)
12     {
13         cout << "Hello, " << name << "." << endl;
14         
15         m_name = name;
16     }
17     
18     void print()
19     {
20         cout << "I'm " << m_name << "." << endl;
21     }
22     
23     ~Test()
24     {
25         cout << "Goodbye, " << m_name << "." << endl;
26     }
27 };
28 
29 int main()
30 {
31     SmartPointer<Test> pt(new Test("D.T.Software"));
32     
33     cout << "pt = " << pt.get() << endl;
34     
35     pt->print();
36     
37     cout << endl;
38     
39     SmartPointer<Test> pt1(pt);
40     
41     cout << "pt = " << pt.get() << endl;
42     cout << "pt1 = " << pt1.get() << endl;
43     
44     pt1->print();
45     
46     return 0;
47 }

运行结果如下:

小结:

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9594385.html
今日推荐