QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

: }" Z# H( H5 H+ y

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

, Y* |7 L: E! ], _2 [' P3 b

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

+ W M/ k6 M# e) i4 U5 [

4 a3 g- d9 f% B; t: I

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

. }; w7 t& O# X, n7 U7 J

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

6 ]4 k3 ^) L, H8 j j6 Y* x6 I

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

) Q: D6 P, Z9 n( D3 q& ^

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

. s0 Q2 z, O; x$ x8 K8 w* E9 g

#include <classes.hpp>

1 u& @5 A( N" n8 S* {

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

* @- `2 C6 q* [4 z

template <class T>

2 ~3 ]- M" Y. h# m2 a! @8 a9 d

class TTypedList : public TList

9 D9 C% P2 e3 S8 X3 _

{

* D+ P+ O% X6 o ]9 @6 P

typedef TList inherited;

3 \( a4 J5 p8 N7 l

private:

9 Y& h/ ?& \* q P" |

bool FAutoClear;

1 Q2 _1 a: {( f; m

TClass FItemClassType;

' I/ k: X1 m" d3 ?3 a% `

protected:

f3 L5 q6 Q0 B7 B6 K' U+ Z. t7 }

T* __fastcall Get(int Index) const

% y1 e; [. |/ O; Q. }1 [- h* o, A

{

- D. c: W4 q7 w2 y8 `- T) t1 t/ ]

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

* R" _- G# F6 Y, j$ }

}

- n& ]9 R& M# R# D9 a2 O7 `

void __fastcall Put(int Index, T* Item)

8 `! F2 X+ B. }" r4 J4 f6 J; n

{

* d0 ^/ r' P% {' E, L

inherited:ut(Index, Item);

/ q' N' a7 [) N7 W+ f) H4 }( `

}

5 U# y2 V |% E, M' j& q2 p1 W7 R

public:

0 Q8 w" N6 E0 M1 D# {3 V

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

# ~# _9 ]8 [1 C7 e( S. l- J' G" S* q

public:

0 A& V1 f& e0 B; u$ ]

__fastcall TTypedList(bool bAutoClear = true)

& `, y' E+ e8 q" [1 |: L1 Y

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

$ P3 l% ?0 I7 Y4 ]6 Q: K- M

{ }

! K9 G! k5 K, ?) c

// no destructor needed

+ }2 O3 O$ k$ f: `4 y* m' d

int __fastcall Add(T* Item)

9 y7 T4 D/ K8 Y T+ _2 i+ R

{

7 T! q/ l$ ~' v* C6 `* ^6 }% T

return inherited::Add(Item);

! K( q( G& J- y# f! D

}

8 Q/ D# }$ D# Z5 ^" D8 O

int __fastcall AddList(const TTypedList& List)

, K' R- l( `7 _. }! \

{

: N: V+ t) }! ]* q

if(this == &List)

+ `5 j) \+ S. _) G) E

{

/ J* r( s6 |9 S# o4 I

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

: [; m. [) P1 q

}

. ^0 N) ~. c% U9 X( X

if(FItemClassType != List.FItemClassType)

9 @( R% b, R, F \7 p, v: `

{

+ H5 I* B* R8 ^6 f8 H

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

2 p$ X* }# h( g$ f

Type!");

8 |# {. v% ^- R% k

}

' d0 V! O7 r. E" h- D4 V

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

/ J m) j5 `0 D6 ^( H$ v. B

{

& k. g1 @3 \. a9 P3 l4 s

Add(List.Get(i));

2 ?4 U. V0 r0 V5 ^$ ]

}

% z J W$ E* R( t; A' g

return List.Count;

% M c# ]0 p1 T! ^; E; s4 K

}

7 s- j4 e; S) |4 g9 c' I: u) u

virtual void __fastcall Clear(void)

& J: g. U- D4 W0 w2 C+ J3 b( R6 Y2 b

{

3 _: d! N5 `1 b" z; j

if(FAutoClear)

4 A+ _8 H# z9 J: f9 _8 q

{

7 B% m' {2 [5 S* B

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

! p. {+ V; ^4 l$ n, N. \

{

- M6 v. W% b# J4 R d: W. j

delete Get(i);

. q K4 q% S' b6 K) g6 b* k

}

6 x- t5 P1 T9 A. Q

}

9 J. [3 ?# t3 f R

inherited::Clear();

x& G3 @$ u. h

}

* b# C; J/ ~$ l+ L$ C/ m* V/ S- Z! f) {

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

( |2 o" l# _9 z8 A t5 s: F9 b4 T8 }

{

9 W" K0 s5 J; w% A; `+ v1 e1 @

if(bAutoDelete)

3 `1 u( v' Q- b4 M0 o( _

{

% T2 u( J& E) S* k8 c

delete Get(Index);

' U% H, e2 f+ d3 O; g8 a

}

# F" p$ L" A) L( T

inherited:elete(Index);

: O0 q9 x+ a7 H

}

: ]& u. B% L8 Q |0 \/ a

T* __fastcall First(void) const

5 Y8 s2 ~* l6 N. b0 n# Z

{

% B! U6 c4 a4 i" U1 d

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

: g1 ~1 R$ l+ O3 t$ z

}

) O1 W* S& w! L0 f" g

int __fastcall IndexOf(T* Item) const

; u/ @. H% H. y) G

{

" D' y. b) ^* F9 L B7 e5 y3 k8 A

return inherited::IndexOf(Item);

* K# }, X& f2 e+ Z: K

}

6 i) X5 Q6 d: {7 s+ V. o/ `1 g

void __fastcall Insert(int Index, T* Item)

9 j- l# x" U2 q4 W6 `$ }

{

) a9 a4 ~' @, w* z

inherited::Insert(Index, Item);

# c0 @$ v- q/ _* l$ }2 G# o+ T, v

}

% K9 R: g- E3 Y) p% F+ m

bool __fastcall IsEmpty(void) const

2 m+ B, g) y; _+ s; h- F: A$ Y! I6 B

{

7 @$ h# B$ P- f6 ]0 K: ~+ p

return Count == 0;

4 K8 F; n' R2 f) a o

}

* X# W, M/ S0 _' u* a: d7 B% e( v$ x

T* __fastcall Last(void) const

, B2 {8 _/ U$ J, b

{

- \- z- h) n1 h5 t3 W

return (T*)inherited:ast();

( V+ m0 C: x! K6 ~3 y: r7 \# I3 l

}

& b% K# e$ y$ N

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

! f; R9 `* o3 i1 a6 q# w! e& b6 V

{

6 A+ [& Q9 L! T8 o9 q% r

int nIndex = inherited::Remove(Item);

# Q! |3 Q( B# Y2 Y$ w' _' F

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

9 G' {2 }; T* |1 M2 s

{

: w: h9 w1 A2 j% `3 r! q

delete Item;

. V6 v, E# |6 W9 J1 l

}

8 K' o& T$ b: M1 L& P

return nIndex;

0 a" i+ ?- c& p9 D' b7 c5 l, F$ P

}

. r& s! o5 K) v5 [/ _. K, ~8 a) T

void operator<<(T* Item)

# K t+ J6 A( m# d$ C; Z* J4 B# q' y- M

{

! A7 n$ L# y. F2 z

Add((T *)Item);

, B" H0 K+ E6 Y# t9 ], g) }

}

, y5 W8 F- x' C

void operator<<(const TTypedList& List)

; F; V2 L$ s7 N - g' S+ H0 A# Y2 {2 A$ P1 B( C' E

{

3 q, e% m' L4 N/ [9 z% U

AddList(List);

) d( p7 W6 t8 N$ P9 B: ?

}

& @ b' Z. v6 s% q$ n% P

}; // end of TTypedList

8 D V+ U" ~" P C3 O! W

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

# H) K7 y+ z2 }

#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-8-12 02:07 , Processed in 0.331006 second(s), 52 queries .

回顶部