两个类头文件相互包含出现的问题 : 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

原创 2016年08月31日 00:15:14




本文中,为了叙述方便,把class AClass;语句成为类AClass的声明,把class AClass开始的对AClass的类成员变量、成员函数原型等的说明称为类的定义,而把在CPP中的部分称为类的定义

所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。

一般情况下,C/C++要求所有的类型必须在使用前被定义,但是在一些特殊情况下,这种要求无法满足,例如,在类CMyView中保留了一个非模式对话框对象指针,该对象用于显示/修改一些信息。为了实现对话框"应用"按钮,把对话框做的修改立刻更新到view界面上,为此,需要在对话框类中需要保存view类的指针,这样定义关系就变成如下的代码:

代码如下:
MyView.h:
#ifndef __MYVIEW_H__
#define __MYVIEW_H__
//这是view类的头函数
#include "MyDialog.h"
class CMyView::public CView
{
protected:
CMyDialog * pDlg;
//这里是其他定义
};
#endif


MyDialog.h:
#ifndef __MYDIALOG_H__
#define __MYDIALOG_H__
//这是对话框类的定义
#include "MyView.h"
class CMyDialog::public CDialog
{
protected:
CMyView * pView;
//其他定义
};
#endif



从编译器角度看,编译MyDialog.CPP时,系统首先定义宏__MYDIALOG_H__,然后包含MyView.h,MyView.h中的#include "MyDialog.h"由于__MYDIALOG_H__已经定义,所以不再起作用。在CMyView类的声明中,CMyDialog* pDlg ;就会让编译器产生"CMyDialog"类型没有定义之类的错误,编译MyView.CPP文件出现的错误可以类似得到。

一般的情况,类A和类B需要彼此互相引用,这样必然有一个类会先被定义,而另外一个类后被定义,这样在先被定义的类引用后被定义的类的时候,就导致了所谓的超前引用。

超前引用导致的错误有以下几种处理办法:

1) 使用类声明
在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。其使用方法是:
a) 用class ClassB;声明即将超前引用的类名
b) 定义class ClassA
c) 定义class ClassB;
d) 编制两个类的实现代码。
上述方法适用于所有代码在同一个文件中,一般情况下,ClassA和ClassB分别有自己的头文件和cpp文件,这种

方法需要演变成:
a) 分别定义ClassA和ClassB,并在cpp文件中实现之
b) 在两个头文件的开头分别用class ClassB;和class ClassA;声明对方
c) 在两个cpp文件中分别包含另外一个类的头文件
NOTE:这种方法切记不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。

2) 使用全局变量
由于全局变量可以避免超前引用,不用赘述。我的习惯是,把类对象的extern语句加在该类头文件的最后,大家喜欢怎样写那都没有什么大问题,关键是保证不要在头文件中胡乱包含。

3) 使用基类指针。
这种方法是在引用超前引用类的地方一律用基类指针。而一般情况下,两个互相引用的类并不涉及其基类,因此不会造成超前引用。以开始的例子说:在CMyDialog类中用CView*代替CMyView*,在CMyView类中用CDialog*代替CMyDialog*,这样必然不会造成超前引用。

说明:本文中,为了叙述方便,把class AClass;语句成为类AClass的声明,把class AClass开始的对AClass的类成员变量、成员函数原型等的说明称为类的定义,而把在CPP中的部分称为类的定义。如果大家对这三个词有不同的理解,请按照自己的本意把这三个词换成相应的词来理解。

ps:我是用第一种方法解决问题的。


现象及解决方法:

http://blog.csdn.net/aa4790139/article/details/8235823



版权声明:本文为博主原创文章,未经博主允许不得转载。

出现“error c4430缺少类型说明符-假定为int。注意C++不支持默认int

出现“error c4430缺少类型说明符-假定为int。注意C++不支持默认int:   出现这种错误的原因,是因为函数没有写返回值。是在VC6.0的工程转为高版本(VS2010)的时候经常出现的;...
  • IvanLJF
  • IvanLJF
  • 2013年08月11日 15:26
  • 2350

vs2008编译遇到error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

最近,vs2008编译遇到error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int   具体错误如下: 1>c:\program files\micros...
  • alec1987
  • alec1987
  • 2012年11月20日 21:08
  • 2080

MFC中遇到的关于error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

c:\evan\workspace\1\1\netwowkippack.h(50) : error C2146: 语法错误 : 缺少“;”(在标识符“nSourPort”的前面) c:\evan\wo...
  • xiaomingZeng
  • xiaomingZeng
  • 2017年08月19日 10:24
  • 1739

error C2146: 语法错误: 缺少“;”(在标识符“WINAPI”的前面) 及 “error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int” 解决方案

在VS里字定义了一个工程,添加了一个CPP和H,编译时出现了以下奇怪的错误: 1>c:\program files (x86)\microsoft sdks\windows\v7.0a\includ...
  • chence19871
  • chence19871
  • 2014年08月01日 16:24
  • 10201

operator=(LONG);报 "error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int"的处理方法

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  例子代码:(编译工具:VS2005)  http://www.rayfile.com/zh-cn/...
  • chenyujing1234
  • chenyujing1234
  • 2012年04月12日 11:13
  • 6537

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默

问题一: error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 原因分析: 1. (此情况经常出现在大型工程项目中)如果存在两个类的头文件a.h和b.h,在...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:35
  • 2507

类模板相互引用的问题(错误:缺少类型说明符-假定为int。注意:C++不支持默认int)

问题描述: 现在有两个模板类(头文件A.h为1~14行,头文件B.h为15~27行): 1: ////////////////////////////////////////...
  • licmue
  • licmue
  • 2015年06月07日 19:02
  • 1546

”error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int“ 解决办法

“error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int"如果代码确定没有问题,可以通过禁止 4430 警告来解决 ...
  • jordonwp
  • jordonwp
  • 2011年06月24日 09:56
  • 4292

缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\tlhelp32.h(30): error C2146: 语法错误: 缺少“...
  • sinat_33621733
  • sinat_33621733
  • 2017年10月27日 09:26
  • 238

【MFC BUG】error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

【错误原因总结如下】: 1. (此情况经常出现在大型工程项目中)如果存在两个类的头文件a.h和b.h,在a.h中有这样的语句:#include "b.h",在b.h文件中有这样的语句:#incl...
  • tigernana
  • tigernana
  • 2011年10月18日 21:49
  • 2814
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两个类头文件相互包含出现的问题 : 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
举报原因:
原因补充:

(最多只允许输入30个字)