该模式引自游戏编程精粹,但是他那里面是windows的代码,放到linux下不能运行,所以进行了调整。
+ d+ z% T$ c2 Q* ?8 x) C 说明:在程序设计的时候,会经常用到一组或几组类型相同(classT)的数据,假设我们使用链表存储。 - R0 x6 ]' F5 S$ ] f! {* Z8 c: ^
面临的问题:
& w, a3 Z" \: t8 w8 M0 ` 1、链表存放的位置。 % e4 z! e: ]4 v" c6 z* c
2、每创建一个对象都要插入到该链表中,每销毁一个对象都要从链表中删除 . b- ^( x5 x! Y6 A
3、不能胡乱的插入和删除对象。 1 R( P9 B& ]4 T o3 F; i+ }
要解决上面的问题,可能需要在很多地方插入类似的代码,往往这种代码就是引入bug的地方,有一种解决方案就是“自动列表模式”。 9 [) m- Q \, k5 V
点击(此处)折叠或打开
3 f# n9 J- d( R+ W #ifndef_TAUTOLISTS_H_
& ?. K; m# u% B #define_TAUTOLISTS_H_
+ k5 t& M3 i7 S2 t( z' H #include
$ Z, f* O4 d+ n6 _/ S( F/ q #include , A- }% _2 v4 K [
usingnamespacestd; 7 w6 t& Y# m9 V" P# G0 _. z
template $ G2 o' y, d* o% M
classTAutolists
6 C% b. O9 s; O3 r6 x: ?! } { + N. n0 i3 |5 q' t
typedeftypenamelist::iteratoriter_t;
1 ^0 O0 P5 q$ Y: J* b6 V" i public: * i5 A+ @: p9 @0 R0 [8 q( ]
TAutolists()
: A+ s: y4 ]8 t5 b { / g- E" z6 T5 ?! L! v3 `% F
ms_List.push_front(static_cast(this));
0 D# C. v+ D+ r } 2 j# K' G& g* w3 g0 R* O* Y2 k" H
virtual~TAutolists() % u. C) ]3 Q5 [ m
{ * t# i: A) y, l. N+ A
ms_List.remove(static_cast(this)); 3 [- i2 T' W* S( e! q% O4 o- J
}
5 ^; Q. }9 M( y2 J6 j# M7 h2 U public:
. K) o6 q: f, q+ a8 x% U# u staticT*GetAutolistFirst()
9 i ]: W P3 b { if(ms_List.begin()==ms_List.end()) |