QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2598|回复: 0
打印 上一主题 下一主题

TTypedList一个类型安全的TList模板类

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:11 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

- f0 u, f. P4 r/ w: w

偶在一个老外的文章的基础上写的,应该很有用的说,

$ g/ `( R$ X/ k# @ g9 I

以前总是用STL的vector做替代,但是STL的用法实在不是很习惯

& J3 t8 F$ \. x! f5 a$ |' j U9 R" h; q

% |% C$ e8 {! q$ y7 C

//-------------------------------------------------------------------------

0 l0 G; q- ?9 E2 k# U0 u+ \

#ifndef TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4

& J! o/ f+ l- [8 E- k' G0 W

#define TypedListH_0CBFE2E8-E7C5-4D88-9844-1F177F4B00E4

# Q8 ]9 x! u- U( l/ b: y

//-------------------------------------------------------------------------

- l" i( k7 |* l" `

#include <classes.hpp>

5 Y" x: E" i) Z1 H. A- I% {# D

//-------------------------------------------------------------------------

4 v% f% q h" P* |) k5 ~- M

template <class T>

1 C, a1 n' C* P

class TTypedList : public TList

; a8 l( N) Y; X; X! w; p$ i

{

1 R4 ~. ]+ Q* c

typedef TList inherited;

1 c: i8 n" H5 I; ?0 s. S

private:

/ h. q0 o3 z% i5 A0 u

bool FAutoClear;

# i- N+ W2 X- M5 G Z+ {

TClass FItemClassType;

; ?& ~' P. S; b; l$ w

protected:

. T) U$ u$ n8 f7 |% _# y* h

T* __fastcall Get(int Index) const

) c- S. V. A; R8 p: q+ e% b' B

{

! ^' f. w. K4 D2 S

return (T*)inherited::Get(Index);

, {- c/ c. H7 j4 Y

}

3 I+ Q! D. I: B" U% _

void __fastcall Put(int Index, T* Item)

) w0 z' G2 }( v% j

{

! n+ p) m4 u. G1 I v7 \

inherited:ut(Index, Item);

% M6 [+ N. K: s( g% C# b

}

) ~6 O$ B: A& r* b. K$ B G

public:

+ ]9 B3 Z% v& d7 n& m% Y

__property T* Items[int Index] = {read=Get, write=Put};

' F. w6 Q( _" m* h- B0 J3 _% N' ?& R

public:

" }* R1 n0 F; a: i

__fastcall TTypedList(bool bAutoClear = true)

, ]/ I- n: L* W9 B% _, d2 z- L8 b

: TList(), FAutoClear(bAutoClear), FItemClassType(__classid(T))

2 v9 G* Z% d0 M9 V4 _. h7 c+ f3 w7 |

{ }

8 @; L& Z+ `5 h2 C

// no destructor needed

9 P& D0 K& t ]& h) d: T

int __fastcall Add(T* Item)

' @0 b+ W7 R q' m: P

{

$ h6 W7 s- m& k

return inherited::Add(Item);

; Z, H9 \* x# F0 {

}

9 Y8 Q a6 ]. L: ]

int __fastcall AddList(const TTypedList& List)

" N- [: Z7 }* e/ k( g$ e6 ~0 n

{

: t' ?- \: ` c& ?5 q$ g9 R1 X

if(this == &List)

& S" s8 `- I$ d" L

{

0 `/ I1 P, O# \6 t3 |+ {; Q+ P$ e9 V

throw EInvalidPointer("Can't add a TTypedList to himself!");

1 S0 `( |% ]4 m* M, i# D

}

& L6 `( ^; F5 A6 y. _

if(FItemClassType != List.FItemClassType)

$ B& b4 K) H2 L( l7 b) r

{

: c# [9 @/ F2 o

throw EConvertError("Can't add a TTypedList with a different ItemClass

9 d6 b' R: E% a! m

Type!");

; a/ U& ?2 N+ E, q0 }: \# i

}

5 [+ n" _2 X' m" F; R

for(int i=0; i<List.Count; i++)

+ n4 U/ z7 k2 W, e) h) J

{

3 ?; a3 V; C. I6 C

Add(List.Get(i));

- o4 S4 m! M0 y3 v$ Q6 b, ]; v/ I

}

: o) L! b4 B: Q

return List.Count;

, W) O) t* `' k, R% x6 `

}

5 y! ?- m/ C7 Q2 U

virtual void __fastcall Clear(void)

$ o6 K, @+ P. ~+ `

{

( t4 D6 o( K/ Y/ N4 N$ G { @

if(FAutoClear)

6 f/ h2 Y; S b! U

{

" D( ~% s2 N, [) r2 D8 ?' d

for(int i=0; i<Count; i++)

5 v3 K, t4 a8 Q1 g8 P' y

{

% \7 }5 a; N! P5 o! p9 u# P

delete Get(i);

8 k$ r4 t3 [# j4 q7 E. D* F5 d I" q1 u

}

4 S& F- T1 T E& Q0 R6 L0 l" X

}

& N# I9 H! P9 C" g( g

inherited::Clear();

- Z7 h6 ^3 }$ f1 F

}

& K0 w$ l/ A' O( T2 n7 h

void __fastcall Delete(int Index, bool bAutoDelete = true)

+ r. o9 n8 c a7 B% f' C7 Y

{

7 I T- k C% x* }; T. [% a

if(bAutoDelete)

, }/ Z/ x: X: R% ?( Q* d. c

{

2 j) o2 R+ h$ J5 w# A* r% T3 j

delete Get(Index);

, {, M a+ w+ @" x# P7 d9 I8 X7 [

}

# }8 N% g# H& \0 t

inherited:elete(Index);

/ k1 R' _8 D5 l6 J' X

}

; V* u5 Y8 E8 Y

T* __fastcall First(void) const

& j( ]: m6 E. ]

{

3 ]" n) Y1 C9 U, q. ^# \+ Z

return (T*)inherited::First();

; ^/ G! O9 N! t; T1 _6 p: Z( e

}

; V- {7 x1 P. r# n6 D3 e

int __fastcall IndexOf(T* Item) const

' a7 w' u& E# O, @1 k; T' z

{

' W& z3 h- r8 N$ H

return inherited::IndexOf(Item);

& A+ r: O/ l. O2 @( J9 N) ^! w

}

' M% y1 x# @ [. u/ F. c

void __fastcall Insert(int Index, T* Item)

+ F X4 }7 ]9 r1 }0 n6 t( g; I& O

{

9 @# ]5 A" u; E3 m1 F6 y

inherited::Insert(Index, Item);

3 e1 @0 P5 d8 X

}

4 ?: {2 p! K5 C: e

bool __fastcall IsEmpty(void) const

! H! l% M7 D f

{

; }5 ^' }: e7 `. U3 n& w+ @" {

return Count == 0;

3 @; b _2 I) k c' V; ]2 K

}

0 U0 m$ n% W4 E( r% ^4 L

T* __fastcall Last(void) const

% X: ]+ y# V) k/ Y" _

{

2 N; X% z0 ]9 ^5 ^1 O9 u

return (T*)inherited:ast();

9 o O& g5 g1 Y/ ~: \8 b7 ^9 _

}

% Q& O6 i, m/ g( s2 s# [4 a: G) p% l

int __fastcall Remove(T* Item, bool bAutoDelete = true)

: U' m1 b- c2 x' ?5 t4 O6 H/ O

{

: v. u9 _' d( n6 d

int nIndex = inherited::Remove(Item);

. L7 T0 J5 k; |7 J

if(bAutoDelete && (nIndex != -1))

+ M6 V \0 x9 F

{

; l ?( Y5 [# n# c) Z

delete Item;

" [1 E/ y( e/ L; u

}

& T3 K, j" ^" n& y3 W: m; b

return nIndex;

+ j: W$ m' h* } \" m5 n

}

* j* Y' d& m, ^6 G+ O- }4 F9 B

void operator<<(T* Item)

9 W! ]' N" u: E* j% g+ N- M1 {/ N

{

3 E6 z5 f- ~8 {

Add((T *)Item);

0 e! L4 [. \" u C& y" w1 y" a

}

1 b' M Z& [; x: o! U+ X; w

void operator<<(const TTypedList& List)

8 R7 I. S C3 I' N: N2 n- q4 s . n/ c3 n8 O( z/ C1 q( Q

{

5 g. w0 L" w& f% }# F

AddList(List);

- S' e; b6 _ Y' u1 t `" ^. ?

}

+ k3 R& W1 {) X$ a

}; // end of TTypedList

8 _* p. L+ G2 i9 ]; ]) V- Q7 K

//-------------------------------------------------------------------------

' w; x, b/ ^& P" y" i

#endif

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-10 21:09 , Processed in 0.408330 second(s), 52 queries .

回顶部