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

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

 2009-02-11 20:00:37 来源:WEB开发网   
核心提示: 由于CMultiDocTemplate类可包含多个文档,依靠其成员函数GetFirstDocPosition和GetNextDoc完成对文档链表m_docList的遍历:POSITION CMultiDocTemplate::GetFirstDocPosition() const{ ret

由于CMultiDocTemplate类可包含多个文档,依靠其成员函数GetFirstDocPosition和GetNextDoc完成对文档链表m_docList的遍历:

POSITION CMultiDocTemplate::GetFirstDocPosition() const
{
    return m_docList.GetHeadPosition();
}
CDocument* CMultiDocTemplate::GetNextDoc(POSITION& rPos) const
{
    return (CDocument*)m_docList.GetNext(rPos);
}

而CSingleDocTemplate的这两个函数实际上并无太大的意义,仅仅是MFC要玩的某种“招数”,这个“招数”高明吗?相信看完MFC的相关源代码后你或许不会这么认为,实际上CSingleDocTemplate的GetFirstDocPosition、GetNextDoc函数仅仅只能判断m_pOnlyDoc的是否为NULL:

POSITION CSingleDocTemplate::GetFirstDocPosition() const
{
    return (m_pOnlyDoc == NULL) ? NULL : BEFORE_START_POSITION;
}
  
CDocument* CSingleDocTemplate::GetNextDoc(POSITION& rPos) const
{
    CDocument* pDoc = NULL;
    if (rPos == BEFORE_START_POSITION)
    {
       // first time through, return a real document
       ASSERT(m_pOnlyDoc != NULL);
       pDoc = m_pOnlyDoc;
    }
    rPos = NULL;    // no more
    return pDoc;
}

笔者认为,MFC的设计者们将GetFirstDocPosition、GetNextDoc作为基类CDocTemplate的成员函数是不合理的,一种更好的做法是将GetFirstDocPosition、GetNextDoc移至CMultiDocTemplate派生类。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:深入浅出 MFC 文档

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