定义智能指针类

定义智能指针类


        
        
        
        
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  };

你可能感兴趣的:(定义智能指针类)