WEB开发网
开发学院软件开发VC 深入浅出MFC“文档/视图”架构(2)――文档模板 阅读

深入浅出MFC“文档/视图”架构(2)――文档模板

 2009-02-11 20:00:37 来源:WEB开发网   
核心提示: 很显然,CPtrList是对链表结构体struct CNode{ CNode* pNext; CNode* pPrev; void* data;};本身及其GetNext、GetPrev、GetAt、SetAt、RemoveAt、InsertBefore、InsertAfter、Find、

很显然,CPtrList是对链表结构体

struct CNode
{
    CNode* pNext;
    CNode* pPrev;
    void* data;
};

本身及其GetNext、GetPrev、GetAt、SetAt、RemoveAt、InsertBefore、InsertAfter、Find、FindIndex等各种操作的封装。

作为一个抽象的链表类型,CPtrList并未定义其中节点的具体类型,而以一个void指针(struct CNode 中的void* data)巧妙地实现了链表节点成员具体类型的“模板”化。很显然,在Visual C++6.0开发的年代,C++语言所具有的语法特征“模板”仍然没有得到广泛的应用。

而CDocManager类的成员函数

virtual void AddDocTemplate(CDocTemplate* pTemplate);
virtual POSITION GetFirstDocTemplatePosition() const;
virtual CDocTemplate* GetNextDocTemplate(POSITION& pos) const;

则完成对m_TemplateList链表的添加及遍历操作的封装,我们来看看这三个函数的源代码:

void CDocManager::AddDocTemplate(CDocTemplate* pTemplate)
{
    if (pTemplate == NULL)
    {
       if (pStaticList != NULL)
       {
           POSITION pos = pStaticList->GetHeadPosition();
           while (pos != NULL)
           {
              CDocTemplate* pTemplate =
                  (CDocTemplate*)pStaticList->GetNext(pos);
              AddDocTemplate(pTemplate);
           }
           delete pStaticList;
           pStaticList = NULL;
       }
       bStaticInit = FALSE;
    }
    else
    {
       ASSERT_VALID(pTemplate);
       ASSERT(m_templateList.Find(pTemplate, NULL) == NULL);// must not be in list
       pTemplate->LoadTemplate();
       m_templateList.AddTail(pTemplate);
    }
}
POSITION CDocManager::GetFirstDocTemplatePosition() const
{
    return m_templateList.GetHeadPosition();
}
CDocTemplate* CDocManager::GetNextDocTemplate(POSITION& pos) const
{
    return (CDocTemplate*)m_templateList.GetNext(pos);
}

上一页  1 2 3 4 5 6 7 8  下一页

Tags:深入浅出 MFC 文档

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接