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

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

 2009-02-11 20:00:37 来源:WEB开发网   
核心提示: 从上述代码可以看出,CDocManager类维护一个CPtrList类型的链表m_templateList(即文档模板链表,深入浅出MFC“文档/视图”架构(2)――文档模板(2),实际上,MFC的设计者在MFC的实现中大量使用了链表这种数据结构)

从上述代码可以看出,CDocManager类维护一个CPtrList类型的链表m_templateList(即文档模板链表,实际上,MFC的设计者在MFC的实现中大量使用了链表这种数据结构),CPtrList类型定义为:

class CPtrList : public CObject
{
    DECLARE_DYNAMIC(CPtrList)
  
protected:
    struct CNode
    {
       CNode* pNext;
       CNode* pPrev;
       void* data;
    };
public:
  
// Construction
    CPtrList(int nBlockSize = 10);
  
// Attributes (head and tail)
    // count of elements
    int GetCount() const;
    BOOL IsEmpty() const;
  
    // peek at head or tail
    void*& GetHead();
    void* GetHead() const;
    void*& GetTail();
    void* GetTail() const;
  
// Operations
    // get head or tail (and remove it) - don't call on empty list!
    void* RemoveHead();
    void* RemoveTail();
  
    // add before head or after tail
    POSITION AddHead(void* newElement);
    POSITION AddTail(void* newElement);
  
    // add another list of elements before head or after tail
    void AddHead(CPtrList* pNewList);
    void AddTail(CPtrList* pNewList);
  
    // remove all elements
    void RemoveAll();
  
    // iteration
    POSITION GetHeadPosition() const;
    POSITION GetTailPosition() const;
    void*& GetNext(POSITION& rPosition); // return *Position++
    void* GetNext(POSITION& rPosition) const; // return *Position++
    void*& GetPrev(POSITION& rPosition); // return *Position--
    void* GetPrev(POSITION& rPosition) const; // return *Position--
  
    // getting/modifying an element at a given position
    void*& GetAt(POSITION position);
    void* GetAt(POSITION position) const;
    void SetAt(POSITION pos, void* newElement);
  
    void RemoveAt(POSITION position);
  
    // inserting before or after a given position
    POSITION InsertBefore(POSITION position, void* newElement);
    POSITION InsertAfter(POSITION position, void* newElement);
  
    // helper functions (note: O(n) speed)
    POSITION Find(void* searchValue, POSITION startAfter = NULL) const;
                     // defaults to starting at the HEAD
                     // return NULL if not found
    POSITION FindIndex(int nIndex) const;
                     // get the 'nIndex'th element (may return NULL)
  
// Implementation
protected:
    CNode* m_pNodeHead;
    CNode* m_pNodeTail;
    int m_nCount;
    CNode* m_pNodeFree;
    struct CPlex* m_pBlocks;
    int m_nBlockSize;
  
    CNode* NewNode(CNode*, CNode*);
    void FreeNode(CNode*);
  
public:
    ~CPtrList();
#ifdef _DEBUG
    void Dump(CDumpContext&) const;
    void AssertValid() const;
#endif
    // local typedefs for class templates
    typedef void* BASE_TYPE;
    typedef void* BASE_ARG_TYPE;
};

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

Tags:深入浅出 MFC 文档

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