我自己在SDI中创建分割视图,是按这样的步骤的,这也是参考了CodeProject.com的朋友的文章。为了避免下面错误的产生:
d:\11\11view.h(22) : error C2143: syntax error : missing ';' before '*'
d:\11\11view.h(22) : error C2501: 'CMy11Doc' : missing storage-class or type specifiers
d:\11\11view.h(22) : error C2501: 'GetDocument' : missing storage-class or type specifiers我在视图的头文件的这一段加了
#if _MSC_VER > 1000
#pragma once
//#include "11Doc.h"  《-----新加的
#endif // _MSC_VER > 1000这下可以顺利编译并且成功执行。后来我对比用MFC自己生成的分割视图的例子发现,自动生成的代码中并没有我后面加的这一段,反而在MainFrm.h中发现了这么一句#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CMy00View;  《------------就是这句class CMainFrame : public CFrameWnd
{

protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)请问各位高手,为什么会有这样的差别出现呢?到底他们的用途都是什么?谢谢!

解决方案 »

  1.   

    不包含头文件或类的声明,而在Frame类里使用View类的指针,编译器无法识别该View类。
      

  2.   

    文件作用域的问题,View类和Frame类写在不同文件中。
      

  3.   

    记住一点,头文件.h或.hpp是不单独编译的,
    编译是以实现文件.cpp或.c为编译单位的,
    头文件是在实现文件中展开编译的,
    有些类用到了指向另一些类的指针,
    如果该头文件在cpp的展开点,
    编译器仍不知道指针指向的类是否是一个类型,编译会出错.
    这种情况要进行前置声明或包含指向类的头文件,
    为的就是编译器在编译cpp时能识别指针指向的类.一般都不用前置声明,只要包含相应类的头文件即可,
    除非是交叉引用的情形.(即a.h中用到b.h中的类,而b.h中也用到a.h中的类)