随笔 - 20, 文章 - 0, 评论 - 5, 引用 - 0
数据加载中……

定义智能指针类


1 // autoPtr.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7 class HasPtr 8 { 9 public: 10 HasPtr(int *p,int i):ptr(p),val(i) 11 { 12 13 } 14 int *get_ptr()const 15 { 16 return ptr; 17 } 18 int get_int()const 19 { 20 return val; 21 } 22 void set_ptr(int *p) 23 { 24 ptr = p; 25 } 26 void set_int(int i) 27 { 28 val = i; 29 } 30 int get_ptr_val()const 31 { 32 return *ptr; 33 } 34 void set_ptr_val(int val)const 35 { 36 *ptr = val; 37 } 38 private: 39 int *ptr; 40 int val; 41 }; 42 43 44 int _tmain(int argc, _TCHAR* argv[]) 45 { 46 int obj = 0; 47 //默认 复制 赋值 指针共享同一对象 48 HasPtr ptr1(&obj,42); 49 HasPtr ptr2(ptr1); 50 ptr1.set_int(0); //只改变ptr1中的val 51 cout<<ptr2.get_int()<<endl; //输出的仍然是42 52 cout<<ptr1.get_int()<<endl; //输出的是 0 53 ptr1.set_ptr_val(44); //设置了ptr1跟ptr2指针 同时指定的对象 54 cout<<ptr2.get_ptr_val()<<endl; //输出44 55 //出现悬指针 56 int *ip = new int(42); //动态分配 并初始化为42 57 HasPtr ptr(ip,10); //ptr 指针指跟 指针ip 指向同一 对象 58 delete ip; 59 ptr.set_ptr_val(12); //指针所指的对象都释放了.... 60 cout<<ptr.get_ptr_val()<<endl; //仍然能输出??? 61 return 0; 62 } 63
 1 //保存指针和使用计数,每个HasPtr对象指向一个U_Ptr对象,使用计数将跟踪指向每个U_Ptr对象的HasPtr对象
 2 class U_Ptr
 3 {
 4     //HasPtr 成员可以访问 U_Ptr成员
 5     friend class HasPtrN;
 6     int *ip;
 7     size_t use;
 8     U_Ptr(int *p):ip(p),use(1){}
 9     ~U_Ptr(){delete ip;}
10 };
11 
12 //新的HasPtr类
13 class HasPtrN
14 {
15 public:
16     HasPtrN(int *p,int i):ptr(new U_Ptr(p)),val(i){}
17     HasPtrN(const HasPtrN &orig):
18     ptr(orig.ptr),val(orig.val)
19     {
20         ++ptr->use;
21     }
22     HasPtrN& operator=(const HasPtrN&rhs)
23     {
24         ++rhs.ptr->use;
25         if (0 == --ptr->use)
26         {
27             delete ptr;
28         }
29         ptr = rhs.ptr;
30         val = rhs.val;
31         return *this;
32     }
33     ~HasPtrN()
34     {
35         if(0 == --ptr->use)
36             delete ptr;
37     }
38     int *get_ptr()const
39     {
40         return ptr->ip;
41     }
42     int get_int()const
43     {
44         return val;
45     }
46     void set_ptr(int *p)
47     {
48         ptr->ip = p;
49     }
50     void set_int(int i)
51     {
52         val = i;
53     }
54     int get_ptr_val()const
55     {
56         return *ptr->ip;
57     }
58     void set_ptr_val(int i)
59     {
60         *ptr->ip = i;
61     }
62 private:
63     U_Ptr *ptr;
64     int val;
65 
66 };
 1 class HasPtrValue
 2 {
 3 public:
 4     HasPtrValue(const int &p,int i):ptr(new int(p)),val(i){}
 5     HasPtrValue(const HasPtrValue &orig):
 6     ptr(new int(*orig.ptr)),val(orig.val){}
 7     HasPtrValue & operator = (const HasPtrValue&rhs)
 8     {
 9         *ptr = *rhs.ptr;
10         val = rhs.val;
11         return *this;
12     }
13     ~HasPtrValue(){}
14     int get_ptr_val()const
15     {
16         return *ptr;
17     }
18     int get_int()const
19     {
20         return val;
21     }
22     int *get_ptr()const
23     {
24         return ptr;
25     }
26     void set_ptr_val(int p)const
27     {
28         *ptr = p;
29     }
30 private:
31     int *ptr;
32     int val;
33 
34 };

posted on 2010-09-07 16:16 Eping 阅读(352) 评论(0)  编辑 收藏 引用 所属分类: C++基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理