インテリジェントポインタクラスの定義
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
};