当前位置:  编程技术>c/c++/嵌入式

VC++开发中完美解决头文件相互包含问题的方法解析

    来源: 互联网  发布时间:2014-10-19

    本文导语:  所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。 一般情况下,C/C++要求所有的类型必须在使用前被定义,但是在一些特殊情况下,这种要求无法满足,例如,在类CMyView中保留了一个非模式对话框对象指针...

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

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

代码如下:

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

   #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:我是用第一种方法解决问题的。


    
 
 

您可能感兴趣的文章:

  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。
  • 开发板域名解析DNS如何实现呢?
  • ARM开发怎么实现域名解析呢,ARM板能ping通IP,不能ping通域名?
  • ThinkPHP的MVC开发机制实例解析
  • linux命令解析,开发中遇到的一个启动脚本的语句
  • 解析离线安装Eclipse的Android ADT开发插件的具体操作(图文)
  • 解析Android开发优化之:对界面UI的优化详解(三)
  • drupal7 form表单二次开发要点解析
  • 解析Android开发优化之:对界面UI的优化详解(二)
  • DHCP:解析开发板上动态获取ip的2种实现方法详解
  • php提供解析php脚本的api吗?哪里有这样的开发包?==〉〉分数不够可以另开贴子;up有分!
  • WinForm项目开发中NPOI用法实例解析
  • android开发基础教程—三种方式实现xml文件解析
  • 解析Android开发优化之:软引用与弱引用的应用
  • WinForm项目开发中Excel用法实例解析
  • 解析Android开发中多点触摸的实现方法
  • Android开发之XML文件解析的使用
  • 解析Android开发优化之:对界面UI的优化详解(一)
  • 解析Android开发优化之:对Bitmap的内存优化详解
  • 解析Android开发优化之:从代码角度进行优化的技巧
  • 开发板运行交互式网页,控件包含linux命令,用什么方法实现?
  • Linux开发中得头文件包含问题
  • 求高人指点,B/S结构的带复杂数据库(包含了图片等)的软件用什么语言开发好?
  • 请问linux下有什么好的C、C++开发IDE,能包含C、C++齐备的文档就更好了
  • 一个 Linux 下 C 语言开发的常见问题:如何包含头文件?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux 下c++开发error while loading shared libraries问题解决
  • 快速应用开发解决方案 OpenROAD
  • Java的Web开发解决方案 OpenHandX
  • jsp/servlet开发网站,客户端打印解决方案探讨!
  • 用jbuilder开发entity bean中这个问题怎么解决??
  • 用JET编译的程序怎么还需要JDK开发环境!!怎么解决???
  • 请帮助解决开发 操作系统 的所需步骤
  • 【一个关于Linux/Unix程序开发的问题,很久了,没有人解决】 ---------UP有分,高分求解
  • jb5+win2000下开发的应用,在linux下运行报Font specific not found,如何解决?
  • 安装GTK开发环境,未满足依赖关系,如何解决?
  • android开发环境遇到adt无法启动的问题分析及解决方法
  • linux下用eclipse进行开发,尤其打开较大的python代码模块,老是会卡,请问大家有没有好点的解决办法,如能提供具体设置,不胜感激
  • win2000里开发的php+mysql程序,在bsd里不能删除修改,如何解决
  • 请教各位Java/JSP进行Web开发绘图(如股市实时曲线),除Applet外还有什么解决方案?
  • 越弄java越发现自己是菜鸟,好多方面都没有涉及到?你们大家都集中在哪方面开发?顺便帮我解决个小问题?
  • 在Android开发中替换资源图片不起作用的解决方法
  • 解决Fedora14下eclipse进行android开发,ibus提示没有输入窗口的方法详解
  • 分享Android平板电脑上开发应用程序不能全屏显示的问题解决
  • 嵌入式 linux开发中,加入网络通信代码后,ARM9启动后在超级终端打印出错误信息,请帮忙解决!谢谢
  • android开发 eclipse alt+”/”自动提示失效的解决方法
  • 请用过weblogic和jbuilder整合开发ejb的前辈务必帮我一下,我碰到问题一直无法解决,很急!!!
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • linux 嵌入式开发用不用买开发板,买什么样的开发板?
  • ios app 开发中ipa重新签名步骤介绍
  • 请问shell 开发能开发什么样的程序?硬件的驱动程序是否能够开发呢?
  • 几个windows平台C++开发错误举例
  • 请问在Linux 下用C开发移动增值软件都有什么开发工具啊,我以前一直在Windows下用VC开发
  • IOS开发:UIScrollView类介绍及如何简单地截获touch事件
  • 我常未开发过Linux下的程序,请问Linux下可以使用那些开发工具,最好的开发工具是什么版本?
  • nginx最新主线开发版1.5.4发布及下载地址
  • 我是学习web开发的,主要是java开发SSH开发框架和ajax等。我想知道有没有必要学习一下linux相关知识。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3