QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

9 j# A2 k& x% \: p

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

/ I) P- j/ V6 w, O1 T1 _

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

1 {, A8 Z( _' I! i

) t `9 F& l/ F0 I& }

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

" B5 ?) n7 Y* p3 t7 O1 j

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

/ [* l) |% S7 c" K7 K3 p) P5 X1 i

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

+ Z4 i( k) B V2 G9 x) a- M

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

/ A- R8 O' I! g% h

#include <classes.hpp>

7 j7 a$ ]" J2 F/ h' |

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

8 ]5 i1 k. Q0 z7 d+ [

template <class T>

2 W2 a6 u" {. t9 \

class TTypedList : public TList

; y! e, m% |+ ^. P5 `

{

4 A- o1 e, S8 I, J. n r5 n/ s+ i

typedef TList inherited;

1 ~0 G1 n" Z1 `8 n) h

private:

( S8 z& q) {) J" E2 e* c

bool FAutoClear;

8 n" ]. {7 I) a+ h2 W

TClass FItemClassType;

- ]- F9 X8 s; A" Q6 F

protected:

9 M" G. K) ?( A( Z

T* __fastcall Get(int Index) const

2 q$ u. R7 D0 M( d9 f

{

* S3 X( ?, e/ y ?' v

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

: {4 d- T2 ^$ X6 k

}

4 z2 O" t# a' Q. F* O0 R

void __fastcall Put(int Index, T* Item)

- e' j9 ]9 N/ O" A+ Q/ ]( m. P* H

{

: k& O7 _2 v' v- ]

inherited:ut(Index, Item);

/ ]' c0 }# [: R8 W/ s$ F h

}

; K- D. k' K+ x$ [& D5 e

public:

% ~/ B% f4 A$ g( z' G5 l6 l' v% V

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

. g6 V6 e5 n2 Z8 J# U

public:

W. ]# z0 Q+ c7 ?5 |$ q; F

__fastcall TTypedList(bool bAutoClear = true)

# X& F+ ~9 K! |% G: G* Q; |

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

, B" J) d* m9 R5 g

{ }

* @' E: Q, T1 |

// no destructor needed

9 v: ^* V# E& }, @5 [/ S/ V

int __fastcall Add(T* Item)

' B! V, y0 f' H5 n' q3 [

{

$ I. `9 l* J, a# ?' m) T9 A

return inherited::Add(Item);

$ a$ R& f% K7 w& a* y, M- X2 N7 N

}

2 q5 N, `" D( T0 ]4 r

int __fastcall AddList(const TTypedList& List)

0 s- N' ]( {& V3 {1 `: f, W

{

) L2 N* m5 r" ~( c8 G

if(this == &List)

. Y: k2 ~) O0 R, b( V2 p' ]

{

. A! \8 s5 J" Y$ F9 Z

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

1 T2 r/ ~' K- O8 j

}

3 G. t P; z6 A$ v& S) s

if(FItemClassType != List.FItemClassType)

' @% E* P6 [# h4 L. [" p5 U0 P, _

{

& b" u& V7 [9 ^" B

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

, V$ z+ `! S/ \0 f$ d

Type!");

8 U) |* o" G6 E6 O7 [) ^5 N

}

7 g$ W0 _" `8 o

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

" H3 S3 u, h2 w, ^4 s% V) M

{

% W. M: A, A: X+ o' f8 c

Add(List.Get(i));

$ M5 T( t% p t

}

$ w! U5 E9 \* N$ U L& r( j# v

return List.Count;

P5 r9 ~ z5 _2 z v* Y

}

3 r" |9 {3 L* S% S+ r" N

virtual void __fastcall Clear(void)

' D3 Q8 {/ ?! S) k, R

{

7 _ q8 ?2 d8 ^1 y

if(FAutoClear)

5 Y7 |" ]' \% ~+ y' ]+ ]+ i: o- q9 L

{

9 q0 e3 y$ i% [, k* B9 p( h

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

3 W4 f. c! X' R- d! H! I

{

# A. W! c; {3 n+ K

delete Get(i);

. {9 }2 b3 h5 C' v/ J9 s' ?. P

}

$ |+ K& U1 y: t- ?+ g- b

}

2 V8 ^; @' o2 i

inherited::Clear();

0 Y a! p6 C1 z

}

* L- V' @9 O) u: F7 m

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

% A9 D4 Y. M; E/ W7 L

{

) K/ V+ V9 n8 c- I% L

if(bAutoDelete)

2 K8 l5 |, s! C# t2 U

{

5 u5 n2 F9 N7 K1 L2 Q

delete Get(Index);

2 W$ w0 e P( O% q5 ~0 N: e

}

' Z+ ]- D) p5 I8 P- P6 x

inherited:elete(Index);

5 D; m* Q- f2 G4 g, Z s

}

, H6 F, l* s' \ F3 g

T* __fastcall First(void) const

. Z7 U6 _8 U L/ J0 N2 k# p, p

{

; R8 A. G6 t- G; e# Z

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

/ y/ z$ H& w1 |9 b

}

) H. _" b* K0 d& f8 B+ D. a

int __fastcall IndexOf(T* Item) const

' ^4 C& L2 I; D) J3 S) y

{

; `/ ^5 h9 d" O3 G! C+ k1 H( y. ?

return inherited::IndexOf(Item);

, L, O- j9 U7 k! s0 s2 G

}

4 B+ W/ }8 A o/ K5 Y6 v

void __fastcall Insert(int Index, T* Item)

4 O8 b& K! D2 n$ g

{

! y+ G* h/ U1 k# f3 X* }

inherited::Insert(Index, Item);

! o( [6 z. f& y3 w1 j# q4 {3 m

}

0 d! |" F; ?3 b$ V- M' M* m% w& X

bool __fastcall IsEmpty(void) const

# D; m$ r2 Y* r

{

( M" E4 ~/ t- h. {, H. z' p; C

return Count == 0;

( [; W0 Z7 e! a* w

}

$ U; V, c" S( e" n4 z _+ ?

T* __fastcall Last(void) const

) r7 S* v `& K; b$ D4 h2 P

{

8 u1 m7 _$ G5 Y2 V4 U

return (T*)inherited:ast();

9 X0 K. z, m4 s: V

}

9 y0 k" E8 v0 q

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

2 x/ f5 z5 v$ c/ k& V7 ?

{

3 D# N% d8 J% E& f" H0 H$ w1 [

int nIndex = inherited::Remove(Item);

- y+ m2 E$ u- {. C/ {

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

- q) [& V. l0 [! x9 W2 U7 M

{

) E" v+ r6 J1 v5 j$ z1 G

delete Item;

5 x$ i) t5 J/ L* d( W$ T4 g, D3 W

}

* p% z u5 q$ T

return nIndex;

+ o2 ?1 y/ }/ s* @$ y& N3 P3 \

}

4 V4 }6 J4 C. k5 x* G

void operator<<(T* Item)

$ e7 P7 a( a3 ?

{

# F7 u6 i' G7 I, r# v1 t- d& y

Add((T *)Item);

7 u; w& c$ B* G2 P5 C

}

& a; I' a- D' X6 v8 o& V

void operator<<(const TTypedList& List)

0 m8 l% ? H" a, \ 4 _5 k" w8 }6 J- t5 _4 U4 N

{

( p8 B/ c% i( r8 }& a5 i d" L. n

AddList(List);

5 P! s& s9 ^" M) R

}

: k* y0 |+ O+ u& v. B8 n

}; // end of TTypedList

/ h4 _" K- h" Z8 A

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

! h* ]7 O2 Z; {$ y1 B9 Q: _

#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-13 00:27 , Processed in 0.486686 second(s), 52 queries .

回顶部