2012軟考程序員輔導:C++自動列表模式

字號:

該模式引自游戲編程精粹,但是他那里面是windows的代碼,放到linux下不能運行,所以進行了調(diào)整。
    說明:在程序設計的時候,會經(jīng)常用到一組或幾組類型相同(classT)的數(shù)據(jù),假設我們使用鏈表存儲。
    面臨的問題:
    1、鏈表存放的位置。
    2、每創(chuàng)建一個對象都要插入到該鏈表中,每銷毀一個對象都要從鏈表中刪除
    3、不能胡亂的插入和刪除對象。
    要解決上面的問題,可能需要在很多地方插入類似的代碼,往往這種代碼就是引入bug的地方,有一種解決方案就是“自動列表模式”。
    點擊(此處)折疊或打開
    #ifndef_TAUTOLISTS_H_
    #define_TAUTOLISTS_H_
    #include
    #include
    usingnamespacestd;
    template
    classTAutolists
    {
    typedeftypenamelist::iteratoriter_t;
    public:
    TAutolists()
    {
    ms_List.push_front(static_cast(this));
    }
    virtual~TAutolists()
    {
    ms_List.remove(static_cast(this));
    }
    public:
    staticT*GetAutolistFirst()
    {
    if(ms_List.begin()==ms_List.end())
    {
    returnNULL;
    }
    else
    {
    ms_ListIter=ms_List.begin();
    return*ms_ListIter;
    }
    }
    staticT*GetAutolistNext()
    {
    if(ms_ListIter==ms_List.end()
    ||++ms_ListIter==ms_List.end())
    {
    returnNULL;
    }
    else
    {
    return*ms_ListIter;
    }
    }
    staticunsignedintGetAutolistCount()
    {
    returnms_List.size();
    }
    public:
    staticlistms_List;
    staticiter_tms_ListIter;
    };
    //Declarationsofstaticvariables
    template
    listTAutolists::ms_List;
    template
    //typedeftypenamelist::iteratoriter_t;
    typenamelist::iteratorTAutolists::ms_ListIter;
    #endif
    測試程序:
    點擊(此處)折疊或打開
    #include
    #include"TAutolists.h"
    classvec:publicTAutolists
    {
    public:
    intm_x;
    intm_y;
    };
    usingnamespacestd;
    /*
    template
    classA
    {
    public:
    staticTa;
    };
    template
    TA::a;
    intmain(intargc,char*argv[])
    {
    A::a=0;
    }
    */
    intmain(intargc,char*argv[])
    {
    veclv1;
    lv1.m_x=1;
    veclv2;
    lv2.m_x=2;
    cout《"countis"《lv1.GetAutolistCount()《endl;
    vec*cptmp=lv2.GetAutolistFirst();
    while(cptmp)
    {
    cout《"xis"《cptmp->m_x《endl;
    cptmp=lv2.GetAutolistNext();
    }
    return(0);
    }