QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

8 x4 M' U7 _5 ~- L0 } M5 C2 ~

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

& O: S: B& |9 Z3 x3 K

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

( E& Q$ t( `# z- Q9 h: P! T

6 F' Y5 M5 V! x& b$ I

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

4 \: T6 h# \$ H Q" c. R7 G* V

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

5 O* A# `) h$ N" x

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

' T& m- Z7 v- R9 s1 ?/ e" H" m7 U

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

+ r; y/ e t( V$ m! p3 b) i2 ]

#include <classes.hpp>

% A# V9 ~% d8 ^+ Q

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

+ [. q" Q8 ]! q# B; o( G6 h( N

template <class T>

# {/ k3 s! }3 D, B+ G- m& r& G& | @

class TTypedList : public TList

, e! _: e4 y- v" b! G# Y- V

{

[7 T& T& N, L! V1 U6 P

typedef TList inherited;

- Z, G6 l) n3 B# L* V: _* G7 [

private:

; ]! P! n/ l* A1 `( ~' I6 v+ o" c2 l

bool FAutoClear;

( A9 v! d! b' Z. y

TClass FItemClassType;

W) ]. x4 p9 \5 ~% l) ~

protected:

, D+ `/ i) u) ?

T* __fastcall Get(int Index) const

8 [4 V g- _$ |; W, H0 H

{

% G- {" N; \' J1 \0 V; f' z

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

3 h1 p7 j' q& s V

}

" O+ H' ^" v' o! U) X2 B4 W

void __fastcall Put(int Index, T* Item)

S: w8 d( k, E. l, j8 B6 l+ ?

{

* K$ c" C- ?" {+ Z8 D- k

inherited:ut(Index, Item);

1 I4 s8 x7 F k8 ~* e. T; ]4 W

}

6 k/ @7 O4 r" r2 u& Y# R

public:

, V8 a* M% Y$ C! S

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

. ^& j; i/ p7 b) R% j

public:

2 Y3 \6 s2 h% u% B

__fastcall TTypedList(bool bAutoClear = true)

0 h5 g! q& S: N

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

! J5 L; ], [& r1 B5 L

{ }

1 w4 h7 z" W& ]1 H$ Z3 i5 ]& l

// no destructor needed

1 ~: R) a& f' {7 c# W- p

int __fastcall Add(T* Item)

5 J1 B1 i# L5 U. e& V1 B" j

{

' u! y* s F; t( c7 A z5 r

return inherited::Add(Item);

3 c) k8 E0 c$ B! [

}

2 @1 l. ~$ ^+ j" M& I, E4 `

int __fastcall AddList(const TTypedList& List)

3 @7 A; ]0 c/ X

{

4 V( z7 o' v+ B, }7 v

if(this == &List)

" p& H8 J/ V+ g+ ^6 D! u- V

{

6 G' j5 p7 P0 I2 }% n

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

- K7 T" o9 z+ d5 |4 ~1 ~

}

4 g2 x) b. E. `: r7 \& t* m7 m

if(FItemClassType != List.FItemClassType)

! _2 W) f" S+ T2 q

{

7 n- P$ R1 q6 u# |" Y- e

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

! G0 R0 o. P* D, O3 K/ e

Type!");

! `7 b5 A& n- n

}

7 a" G8 \! Y& ^. I) @3 x

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

e" t5 h4 X8 f. p; o

{

/ u4 ~7 m2 `$ d# O# e5 o ^$ O7 A

Add(List.Get(i));

+ {" }6 S2 |( ?8 M2 d- D9 ~: m2 X

}

9 z) g w, ~5 U v0 b; X; n+ }

return List.Count;

0 W [" \" t9 y) U5 A3 y

}

# k/ i; x7 y) D- u+ b- O

virtual void __fastcall Clear(void)

* @ k7 X7 s; |2 V' A b

{

1 j6 } @- N/ ?7 R* V' S7 I

if(FAutoClear)

* C% b8 Y |: h0 e& J5 R7 r! }

{

- R+ S% U8 W1 U/ n

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

. a8 ?0 \* {. |0 r

{

! K [5 d1 T$ w2 D) m

delete Get(i);

8 E! |! o8 J2 @- O$ f/ p

}

% Z1 O7 ]: x/ _/ ~) d7 K

}

; Q# E; i# ]5 \6 p

inherited::Clear();

: P. n9 d7 P: \( Z% {

}

; I7 `7 m- d1 k, Q0 [; ]# k; Y

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

8 e4 z9 F0 i% C2 j( W. Y9 Q: u

{

: G# d' d, I, M

if(bAutoDelete)

" i; W" @! K6 N# L

{

3 h k( l1 B# @' }! j9 h

delete Get(Index);

, W0 X( \# v6 L. A

}

2 k ]% [+ Z6 O& B* J& S" i$ p

inherited:elete(Index);

9 j0 \3 y# n, F" g3 X9 v n8 d

}

- D% M5 z6 @1 {, i2 M

T* __fastcall First(void) const

6 b) C( S2 h2 F3 P6 B( y

{

0 X% K2 t! L1 R9 @

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

2 E7 J; k- w$ t7 T: w, {2 U

}

( g( R* L- |5 y3 G8 m/ I) W

int __fastcall IndexOf(T* Item) const

! g/ V- x5 ^& V: V( ] D' m

{

9 h! K0 w; @9 ]: w! A+ p

return inherited::IndexOf(Item);

e" _" B1 k3 f

}

0 a' E8 N1 D- ]0 t

void __fastcall Insert(int Index, T* Item)

/ I4 Q# D: m9 Y! Y3 d

{

9 b% J' w; _2 H+ S

inherited::Insert(Index, Item);

; N/ \( X- ~6 ~

}

0 j$ V' X' {$ W6 y8 _5 t

bool __fastcall IsEmpty(void) const

$ Q8 b) B; `6 H3 _5 X9 Z

{

' p2 I6 Q; X. m7 d* Y7 H

return Count == 0;

# E6 o* ?1 z6 `: q. e2 Q

}

7 ?( q! a- i2 t" Z

T* __fastcall Last(void) const

, @3 \# J. S( N$ j9 n

{

* H. N! j5 H3 A+ i, k- E; S1 R

return (T*)inherited:ast();

- k8 Q) W6 o6 w6 J, @8 f8 E6 a

}

. t& D/ S U9 ]% Y! e

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

X$ G! l! ?& h0 k$ t' B- U8 f: [' Q+ L

{

% F4 d) B( W! K$ n

int nIndex = inherited::Remove(Item);

; B7 v$ J+ k% v3 c

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

5 X, C) B( S4 L) b# n' T

{

( T- r# r+ Y2 m: i [8 y& P$ a

delete Item;

' e4 d6 s" \/ ]. {

}

# A8 k/ J- V& B& i

return nIndex;

: V" L9 z' q @

}

' a* E2 v0 S2 h: p& @

void operator<<(T* Item)

2 a3 Q% s0 v) ]+ W* O8 `

{

, W/ `, \- m' G" U+ H$ K3 ?1 K

Add((T *)Item);

- q( g( q% ~0 K* [

}

0 ]; k+ o9 s6 s' Z

void operator<<(const TTypedList& List)

- ]0 R1 \. {9 e& D* p# u: O( a+ z

{

( i8 X6 T3 t8 Y. Z Y1 ~

AddList(List);

8 I4 ` l y3 _8 {! K0 m& D

}

* |5 W/ q# k/ B5 u

}; // end of TTypedList

1 |% K6 x3 K# y

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

. U$ I/ o" u7 p. ?- `; m

#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 04:49 , Processed in 0.390330 second(s), 52 queries .

回顶部