MFC自己生成的view类,会自带 CXXXDoc* GetDocument()函数,比较神奇的是它不需要申明class CXXXDoc类,或者包含头文件,编译没问题。如果我自己要搞一个view类,自己写CXXXDoc* GetDocument函数,如果不自己申明一下类和头文件,就会出错。
想了好久没想明白,MFC它自己是怎么做到的?我也比较了好久两个文件的不同,实在找不出原因,请赐教!

解决方案 »

  1.   

    不太明白什么意思 ,不过在APP里已经用CMultiDocTemplate把view和doc关联了
      

  2.   


    对,不过这和我问题无关。我的意思是MFC自己生成的VIEW类中使用一个未知的CXXXDocument类,居然不需要声明该类和包含该类的头文件,就可以编译通过。不知道它如何做到的
      

  3.   

    我是vs 2010 class 
    CMy123456Doc : public CDocument
    {
    protected: // 仅从序列化创建
    CMy123456Doc();
    DECLARE_DYNCREATE(CMy123456Doc)// 特性
    public:
      

  4.   

    哎,大家的理解都不对,我还是贴一下简单的代码吧#pragma once
    class CMyDoc : public CDocument
    {
    protected: // create from serialization only
    CMyDoc();
    DECLARE_DYNCREATE(CMyDoc)// Attributes
    public:// Operations
    public:// Overrides
    public:
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);// Implementation
    public:
    virtual ~CMyDoc();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif CNode* m_pRoot;
    protected:// Generated message map functions
    protected:
    DECLARE_MESSAGE_MAP()
    };
    #pragma once
    class CMyView: public CView
    {
    protected: // create from serialization only
    CMyView();
    DECLARE_DYNCREATE(CMyView)// Attributes
    public:
    CMyDoc* GetDocument() const;// Operations
    public:// Overrides
    public:
    virtual void OnDraw(CDC* pDC);  // overridden to draw this view
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);// Implementation
    public:
    virtual ~CMyView();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endifprotected:// Generated message map functions
    protected:
    DECLARE_MESSAGE_MAP()
    };#ifndef _DEBUG  // debug version in MyView.cpp
    inline CMyDoc* CMyView::GetDocument() const
       { return reinterpret_cast<CMyDoc*>(m_pDocument); }
    #endif请问有没有看见#include "MyDoc.h" 或者 声明Class CMyDoc; 
      

  5.   

    在你的My.cpp文件就是CMyApp源文件前头有#include "MyDoc.h"
    #include "MyView.h"说明在包含view之前已经包含了doc了
    这两句之前还有#include "My.h"
    #include "MainFrm.h"你如果把 #include "MyView.h"放在MainFrm.cpp中包含就会出错了
    因为它在Doc之前被包含,就会找不到声明