SDI 拆分窗口时 两个类似的视图,为什么一个头文件中需要声明DOC类,而另一个则不需要声明

 

  

      LeftView.h中文件

 

class CLeftView : public CTreeView
{
protected: // 仅从序列化创建
	CLeftView();
	DECLARE_DYNCREATE(CLeftView)

// 属性
public:
	CTest1Doc* GetDocument(); //  用到了DOC类
 。。。。。。                                                                                                                        }


 

LeftView.cpp中 已经添加了CTest1Doc的头文件

#include "stdafx.h"
#include "Test1.h"

#include "Test1Doc.h"   //添加了DOC类的头文件
#include "LeftView.h"

 

 

为什么编译时会出现如下错误:


leftview.h(18) :error C2143: 语法错误 : 缺少“;”(在“*”的前面)
leftview.h(18) :error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
leftview.h(18) :error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
leftview.h(18) :warning C4183: “GetDocument”: 缺少返回类型;假定为返回“int”的成员函数

 

原理分析:

c++在编译leftView.cpp 时 已经include Doc文档类的头文件了,为什么还是出错, 很让人郁闷的一件事情。

这个错误的解决很简单,只要在leftView.h中声明一下文档类就可以了

 

#pragma once


class CTest1Doc;

class CLeftView : public CTreeView
{
。。。
}

 

       而这解决方法才是让人疑惑的开始,为什么另一个类似的视图CTest1View, 却不需要在其头文件中声明文档类呢?  百思不得其解。。。,因为不能启动调试,所以还不好确定到底是哪个文件出错了。

      后来想了一个方法,用以确定到底是哪个文件出错------------------------------------------------那就是将所有CPP文件,分别单独的编译下

      结果如下:

                     LeftView.cpp    编译成功

                     Test1View.cpp  编译成功

                     Test1Doc.cpp  编译成功

                     Test1.cpp    编译成功

                     stdafx.cpp  编译成功

                     MainFrm.cpp     编译出错   。。。。。。。。。。。。。。。             终于找到它了 :》

 

    我们看一下,MainFrm.cpp 添加的头文件

 

#include "stdafx.h"
#include "Test1.h"

#include "MainFrm.h"

#include "LeftView.h"

#include "Test1View.h"


 

   用到了LeftView和Test1View两个视图类 而这两个视图中中用到了文档类, 但MainFrm.cpp中并没用添加文档类,所以问题就出来了。。。。。

 

   知道问题所在,便有了对策

  对策1: 在MainFrm.cpp中 添加文档类,且让其在两个视图类的前面

 

#include "stdafx.h"
#include "Test1.h"
#include "MainFrm.h"

#include "Test1Doc.h "

#include "LeftView.h"
#include "Test1View.h"


 对策2: 在LeftView.h中声明一下文档类, 这样因为其处在在Test1View.h的前面,自然Test1View.h中 就不用重新声明文档类了

 

#pragma once


class CTest1Doc;

class CLeftView : public CTreeView
{
。。。
}

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(c,Class,文档,include)