QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

! U( p- Y: L* T0 O3 P9 m5 C

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

# [$ e9 Q$ m& @- p2 T; b

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

& q# G I9 e- V9 \; X. ^5 Q, q9 \

# J4 W7 X6 g3 _& x# o( Z% o

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

! c9 Y3 w) V) s. p

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

' `! R/ \+ I8 q

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

5 t F4 L: n/ H/ I7 f0 D$ m$ K

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

& E$ o" c7 S. z' \% D e3 r1 H

#include <classes.hpp>

3 Q" k5 E! _: S5 ^# _& @

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

9 {2 J2 r5 ]5 b( `% D

template <class T>

0 n8 G. x, t A( k; Y+ s/ D

class TTypedList : public TList

* E& K8 M0 S4 m

{

! [. p; {0 o8 T' J( s# e4 \5 n0 a

typedef TList inherited;

. h9 l1 B4 z. ]: X: _! h

private:

; I% e$ A z- k$ c' _8 D# ]

bool FAutoClear;

4 i& O2 P p! o, t) m( b& J

TClass FItemClassType;

, e& A" m+ z! F1 e2 O) u/ j* p

protected:

. _4 C' n" Z4 s) T$ ~; q* Z

T* __fastcall Get(int Index) const

" A$ p+ w* I s

{

! ? Z! w6 @+ r- O8 O

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

: F5 p- U y5 O- a: ~1 X: K

}

% S0 z0 G4 b( e [, N

void __fastcall Put(int Index, T* Item)

5 Q# L0 i8 X& L) m1 K

{

- z3 }; z: n4 C) b

inherited:ut(Index, Item);

5 x% P" s( {, H; o+ A5 x

}

5 }5 z5 i. M; V3 @

public:

* q3 s+ A- i4 G/ V- m

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

* h# K6 | k0 p

public:

5 ^8 S! L: R2 \7 |. h4 r, H+ ^

__fastcall TTypedList(bool bAutoClear = true)

. k/ ]* m- g8 r* \0 R

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

# ?$ Q: _; k7 W1 S0 f5 O1 q

{ }

9 X5 D0 I- a6 n- i

// no destructor needed

8 X) D+ N5 P( q! v1 E

int __fastcall Add(T* Item)

$ l( q ?6 J+ R* t" u$ T5 K

{

7 b( Z/ s8 p2 A8 v6 z- z0 Z

return inherited::Add(Item);

3 H* ^$ u2 n3 |" E& G

}

7 W, {; o: L% M5 m4 ~( [

int __fastcall AddList(const TTypedList& List)

# z! S. m6 ~8 l+ F+ d

{

+ f9 O$ S$ ~3 Y) M1 Z3 w2 f

if(this == &List)

/ k' v9 I/ g5 N

{

, M$ l) w! B2 d7 Z) ]& g* W

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

# b% n5 ]3 x" G6 B8 v+ M

}

# g" } D) Q# G0 A! p- d

if(FItemClassType != List.FItemClassType)

5 j* [: c+ w9 ^

{

, [( @% N3 A9 }9 E& L; p" G

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

5 I) H2 H' f p3 W$ |

Type!");

& a% z1 C1 I2 p% ]. P5 ~4 r

}

0 Z3 B* V( P5 H, z" _

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

5 L ~6 G* z1 P# ?

{

8 C w* D0 i* w! b4 p

Add(List.Get(i));

! l m6 Z& H7 o2 D& z

}

' e) w1 w' Y% ~4 K1 d9 ^7 x

return List.Count;

4 r9 x0 p Y7 ]8 H5 w3 K

}

" \3 p* l( b" I' I; E ^

virtual void __fastcall Clear(void)

4 Q+ I( L4 G% }+ b1 u

{

; W& d, ~- p/ J4 z1 i3 M) j4 B

if(FAutoClear)

; k5 Q) |% h$ B

{

/ q' k0 a2 f1 B1 c2 f

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

- }7 d5 P& v' c( X9 F3 N# b6 V

{

6 s3 i9 A# O/ b; M5 W

delete Get(i);

) j: @4 P4 s2 H; N' o+ S

}

2 n; O" e, L# [2 Q

}

$ J f: Z9 S( ?7 Y5 L% b! g9 m* C

inherited::Clear();

3 {$ E3 V) A! K) v

}

0 M4 h! X/ j& |; k, k

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

; w( R {/ ~) L/ @ A& S

{

$ _4 m6 u7 j; Z0 t! i; ~

if(bAutoDelete)

! v9 s& C3 r/ X7 G

{

2 U9 [2 P! c7 N# _8 S8 J3 _

delete Get(Index);

4 i j. d: @ w5 }

}

' \/ y# [3 [' u' Y- C7 D4 t

inherited:elete(Index);

9 q" h5 e4 p2 W3 [9 _( _+ a

}

7 ]. f1 E& V& g2 x& h# Z

T* __fastcall First(void) const

' G0 s" Y! [* f4 S! ^

{

: j( ?( d5 A- r' |4 k7 P

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

# U2 B3 i$ P3 f! q1 G

}

% Q9 b5 p% t9 x' d4 \8 ?

int __fastcall IndexOf(T* Item) const

6 S. Y/ C0 L6 ~+ `$ y9 z

{

2 w9 i! d! z$ i: T$ r( N9 p

return inherited::IndexOf(Item);

1 i* F! `( `1 t7 L

}

! }2 p+ O8 p0 L

void __fastcall Insert(int Index, T* Item)

+ U% i( f9 {; Q7 @6 A' W! n

{

1 [( D3 {5 Q! D8 j: m* S, F

inherited::Insert(Index, Item);

+ e$ n8 \, V p

}

. [/ @5 ]8 [7 a7 C1 z

bool __fastcall IsEmpty(void) const

2 K2 V! ]6 G" e# I

{

. c+ G$ f" ~9 X5 Y8 d% }4 O8 `1 z

return Count == 0;

2 |) U6 _8 s' l0 _+ j! X

}

- s8 @# k" U9 f1 f

T* __fastcall Last(void) const

" w! L7 |8 h1 Q* l2 q

{

# C, F5 Y$ O+ q: F

return (T*)inherited:ast();

4 K8 N* V# f2 a# `8 S

}

7 Z8 i. M5 v1 j' n' h6 _+ e

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

7 M6 \, N: N. ?9 E- }8 T: ~

{

* i% t# a% g& e) K

int nIndex = inherited::Remove(Item);

. w' g# e% Q, r

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

j ?& A R1 W; Y5 J! d7 S

{

7 y6 v5 E! k- t8 f3 R

delete Item;

, n3 W) ?+ z6 x! D3 D! Y

}

& u8 ]! f' L+ R' |$ Q

return nIndex;

# w% q% c( e' \* M$ N# `6 Z

}

6 I& w2 L) C8 Y# ], n

void operator<<(T* Item)

) h I3 G8 k$ i1 _4 U4 [+ a

{

! X5 B: B: o3 h+ m) P- y

Add((T *)Item);

# v4 h) ]# A6 U( r" T& Q: p. H; {, A

}

+ s9 t ?8 D4 v: z% _

void operator<<(const TTypedList& List)

8 u* Q# T! @. t E2 V/ S* h# A8 G

{

" h+ ?! r, e5 Z! m% U W. C$ F9 C

AddList(List);

2 l$ k0 c) }4 s2 _

}

1 y% f6 v2 W& m: W7 q

}; // end of TTypedList

* m/ g3 h0 d+ G: G( h3 J0 m* O

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

+ H7 M# N0 A8 h+ L, C! d

#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-14 12:33 , Processed in 0.386119 second(s), 52 queries .

回顶部