QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

K! i" i9 K( ]" U, G& f

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

4 I* _5 a- L9 V$ n$ E) D

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

1 V: ^% d6 `+ B1 ~+ ?0 L

- t+ G3 Q- [9 ]# ^

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

7 ]1 N+ m6 E, K; ?9 P4 q" r

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

C! _3 w# \ B U, p6 {2 V

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

% @( F' T B" ~; m3 F/ B' d

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

* q- {7 N- x- E! W) G+ U0 D

#include <classes.hpp>

2 n9 X$ z: g( A# Y- w

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

+ d- H( H5 k* ?, U) U- `4 Y

template <class T>

. X! n3 X9 H8 K: C# a' F* K) s, Y

class TTypedList : public TList

6 u8 c) e5 i5 P; b8 x+ W# o

{

7 T2 j7 n. g% X) [2 L/ H3 L

typedef TList inherited;

0 g; L b8 w+ T2 I; A

private:

4 `* @* @) b) \0 s5 p+ \* D, O

bool FAutoClear;

0 ]/ s) J+ M8 g) I/ D7 Q$ F

TClass FItemClassType;

7 T! x$ d; V) Z

protected:

- A4 Q1 p3 {* Q1 C7 Y

T* __fastcall Get(int Index) const

& ]" ^7 |$ D( r

{

4 a/ s) a' n5 S& _; N% u

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

W4 i+ S# q% U) K- f. p: {4 B

}

+ Q8 H; e; _; o G, ^

void __fastcall Put(int Index, T* Item)

0 q; P9 d3 R5 |: K

{

, A; a5 A9 P: l" y" }

inherited:ut(Index, Item);

9 _' ^$ F- M5 N7 q v7 x: d: X

}

: Z& q: R+ Y& f- J+ y

public:

$ x) R5 c- D) O

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

3 P2 a) l% L5 \! T

public:

; ^; [( |4 k" q; a2 U) A1 f

__fastcall TTypedList(bool bAutoClear = true)

3 d- t7 B: R4 |/ O- ]3 @. K/ K

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

5 I: Q( |( Z6 ] ?: l

{ }

3 k$ e% J0 C3 D% ^( u& e1 E" J! G5 X

// no destructor needed

1 S; m( x2 u1 h. H: _+ y0 m

int __fastcall Add(T* Item)

$ m1 [2 Z d1 |

{

/ P: E& O' p9 R

return inherited::Add(Item);

: E8 O- h) }- O' I# u8 F. `! P

}

" h( p- d3 ?! J; I9 V' g, a& p

int __fastcall AddList(const TTypedList& List)

4 S4 y, B4 a L: v* s6 k

{

5 G. _3 s' R. z3 u4 @2 k, o

if(this == &List)

! h+ d5 |! H, E" s" T" d1 t

{

" T! I% r7 i3 Y& X/ M4 U) h

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

/ ] G* a6 a$ k* ~8 u+ f

}

2 g# q* [3 }% L

if(FItemClassType != List.FItemClassType)

7 |9 y7 N3 l, ]! \( ]" F

{

6 g% g, i) K" O, P2 y

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

$ N9 M/ T" Y8 M' @

Type!");

' p* }$ q0 A7 n0 H0 v

}

0 J1 Y; [0 J& U9 R, c+ { ^$ ~* {

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

$ [' ^$ ]; L- z9 F$ T5 K% W9 ^9 t1 y

{

8 j* g! a( N! k9 U

Add(List.Get(i));

: i" q& F0 P3 c" I; X, @7 p/ Q! C

}

) H g9 P9 P" V9 X/ W) v

return List.Count;

- t! f8 A6 {' x' c* `

}

) X! ]( R h1 d

virtual void __fastcall Clear(void)

3 q6 e4 y3 T2 Z: Z

{

+ e& `) y: [: t

if(FAutoClear)

- P7 \" ]% H7 U) N1 b9 M/ @$ [* U

{

+ m i9 X/ D4 V

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

( G5 T$ g0 S6 N9 C2 A% |0 k/ A

{

9 X6 m+ k i" s/ V

delete Get(i);

5 H2 {. U# @8 e! Q! e

}

. j) I2 e# K% O5 w; }% G

}

3 u) X M% Z" v/ Y: B

inherited::Clear();

. F& S8 m! Q* Y( J

}

! e# E* M- }0 y' V1 A

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

8 @7 c0 Q( k' y3 j

{

9 a' z7 C3 T5 v1 P4 }

if(bAutoDelete)

6 D/ G8 ]9 y$ r* X

{

+ x \1 J; J" i7 N) t

delete Get(Index);

9 R$ B3 k& v$ o$ q7 H

}

+ J: ?, W6 n( l0 z; r

inherited:elete(Index);

0 ?- r P9 }7 ~

}

7 ]3 o" Z/ g5 A/ h

T* __fastcall First(void) const

- S5 `& U$ l. K5 o6 w) S5 A4 v" F

{

! p! l1 F! ^' @' L

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

0 z/ R* l. J, G! w# `; N

}

6 o5 k8 I5 ^, r/ X& g- ^/ B, q

int __fastcall IndexOf(T* Item) const

" j3 s1 A: D! z) Y: {5 }+ h. S

{

1 q! t& j0 y0 w9 h w

return inherited::IndexOf(Item);

4 x( K4 U1 i/ s) p

}

- `6 M& f0 x) Q

void __fastcall Insert(int Index, T* Item)

8 S, p& ^( @: \7 f5 i `0 R/ f7 I

{

4 W+ W" e( I; M M7 r/ U' q

inherited::Insert(Index, Item);

2 r5 w3 ~( Z! B

}

& S5 S7 k. R3 C1 T. d; j

bool __fastcall IsEmpty(void) const

9 Q9 I* r9 U) j3 x" R

{

+ m2 [8 l( U! S8 A

return Count == 0;

' v# C5 q, z; ?6 i+ G0 y q

}

8 U& Q8 H" B: U: m1 \ h

T* __fastcall Last(void) const

5 V7 I# X& a% M( f1 M3 g

{

1 Y2 m! l6 d$ f& f- m

return (T*)inherited:ast();

; ^( q- l; @! ]

}

7 {( J2 m( Q; l1 B% |

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

" j5 M8 _% N& B$ k3 p" {- V7 b. Y

{

5 Z6 F6 i+ B( o+ N

int nIndex = inherited::Remove(Item);

% I; x, \+ s4 |+ C/ u- G( r

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

/ A# p$ r0 N% ?0 I H; J

{

w; W! H% |$ B9 s8 A0 z$ k l

delete Item;

* j% t* k: B; @, G# p# C! L8 _

}

a0 r- J# f4 m0 L: e* _0 Z: o

return nIndex;

B' A; S: F% k$ K8 @9 _2 b4 y( _0 N

}

% _, I: _/ R) [! |' Y& ~

void operator<<(T* Item)

, R. Z& R! T$ t0 V& x

{

" z* F) c: x% c! K3 I% {6 [+ |3 a

Add((T *)Item);

) G- w6 e! {& Z% _3 i

}

( B& X5 ]2 T) K* g1 L. t

void operator<<(const TTypedList& List)

+ g7 H" `: k! U j E3 |% y0 `1 i% o5 w0 o3 U

{

L6 r# J" o% n- i6 ^8 s! t5 v$ K- l

AddList(List);

6 F5 ]8 q' g7 y

}

' L, ~6 _( z& S+ g& h& v/ A% C' b

}; // end of TTypedList

/ l5 x1 E8 y) z, N$ h

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

+ L% @$ f* ~1 f

#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-4-18 12:07 , Processed in 0.274078 second(s), 52 queries .

回顶部