インテリジェントポインタクラスの定義

21769 ワード

インテリジェントポインタクラスの定義


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