该模式引自游戏编程精粹,但是他那里面是windows的代码,放到linux下不能运行,所以进行了调整。 : J. s7 b# f% f% A7 ^4 l. y* I
说明:在程序设计的时候,会经常用到一组或几组类型相同(classT)的数据,假设我们使用链表存储。 4 h6 n# N- g& U& P/ q7 F1 ?
面临的问题: # N& D' \) x3 t! m i
1、链表存放的位置。
3 D* ]1 K5 D1 `% [$ X 2、每创建一个对象都要插入到该链表中,每销毁一个对象都要从链表中删除
& d* p) ]1 q7 S5 c( M7 D 3、不能胡乱的插入和删除对象。 # g6 X6 W7 J0 l7 O6 F
要解决上面的问题,可能需要在很多地方插入类似的代码,往往这种代码就是引入bug的地方,有一种解决方案就是“自动列表模式”。
/ a5 V" _4 W$ Y6 x S* ] 点击(此处)折叠或打开 ( r" j$ r- r/ W+ u! i
#ifndef_TAUTOLISTS_H_
5 p, n: Z6 v8 e+ `5 P0 J3 l) ] #define_TAUTOLISTS_H_ # @) C& p2 [$ o0 f: m5 j
#include 5 L/ W9 T( z- Y* \' J& r
#include ) l- x1 p2 \4 _$ l1 H9 g7 R7 W
usingnamespacestd;
6 s0 u' c Z5 |. E# ~. v9 s template . [8 _9 ~7 |2 b, `1 t: ]
classTAutolists
& d. \9 X; v8 d; r6 y {
' P, j3 A) S5 O typedeftypenamelist::iteratoriter_t;
+ y0 s3 J0 ]7 |# a) w T* p' f public:
* J$ Z" m M/ I TAutolists()
* \6 ^5 T% v6 P8 M! [6 g {
+ h+ K- R6 e- G8 x9 ]3 ^5 N, v( ` ms_List.push_front(static_cast(this));
1 o5 q1 {4 f' D } 7 P3 |. P8 v+ y7 v `
virtual~TAutolists() * z) A& V7 Y H% ^! {4 U( I1 O9 k
{ ! e7 _( f$ s, g2 b
ms_List.remove(static_cast(this));
3 \# G8 | [( I% a } . Z) Y* }8 F) G. j0 W* Y
public:
+ c- r# z2 `; h staticT*GetAutolistFirst() 6 F! r9 k: q( s: G6 B! Z
{ if(ms_List.begin()==ms_List.end()) |