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
{
。。。
}