内容发布更新时间 : 2024/11/10 2:18:11星期一 下面是文章的全部内容请认真阅读。
MFC中定义全局变量和全局函数的方法
摘要:本文对在Visual C++6.0的MFC程序设计过程中,通过实例形式,给出了三种全局变量和全局函数的三种基本方法。 关键词:MFC;全局变量;全局函数
1 引言
在教授学生使用Visual C++6.0中的MFC基本应用时,由于MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,那样有时会在运行程序时出 现问题。在软件开发过程中,有时需要在不同的类之间利用全局变量传递数据, 利用全局函数处理相同问题,而MFC没有提供类似其他开发工具的模块功能,因此我们只得自己完成。实际上有多种方法可以实现,这里介绍三种常用的方法。
2 定义一个全局类的对象来实现
其实生成这个自定义类对象,我们可以完全参照theApp对象的生成方式[1-2],自定义一个CMyPublicData的全局类。然后生 成CMyPublicData全局对象,通过对象调用全局变量及全局函数。实现过程如下:
(1)添加一个没有基类的新类,设类名起为CMyPublicData,可称之为公用类。
单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CMyPublicData”,单击“OK”,则新类建立完毕。 (2)创建全局的变量与全局函数
实际上是定义CMyPublicData类的public属性的成员变量和成员函数。 CMyPublicData.h的内容:
(3)包含公用类的头文件,使各个类都能访问它
CMyPublicData的头文件应包含在应用程序类的头文件中,这样在其它类中引用CMyPublicData类时就不需要再包含了。若 应用程序类的头文件为Example.h,其样式如下: (4)使用全局变量和全局函数
可在整个工程中,利用MyPublicData.Public_x形式使用变量,可多次赋值,多次调用,利用 MyPublicData.Public_f()形式调用函数。可实现了全局变量和全局函数。
3 利用应用程序类中定义实现
用MFC生成的工程中都有一个名为CxxxApp的类,其中xxx一般为应用程序名,它继承了CWinApp类。CxxxApp类主要进行程 序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数。由于我们很容易获得CxxxApp类的指 针,所以可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp 类的指针,用“AfxGetApp()->成员”访问变量或函数[2-3]。 例:在Example.h头文件中(Example.h为应用程序类头文件)
定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量Public_x和函数这样,变量 Public_x和函数Public_f()可以视作为全局的。
以上两种方法可实现的全局变量和全局函数的运用。虽比较简单,但也有缺点,二者都是定义的成员变量和成员函数,在使用函数时,都要隐式地传递 this指针。这样,有可能对类中的成员不必要的影响。而第二种方法,每次都需要获取应用程序类的指针,这样做比较麻烦。再就是把一些与应用程序类本身无 关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。
4 利用静态变量和静态函数实现 静态变量和静态函数有如下性质:
若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多
1
少个实例,它始终只存在一个,即使该类的 实例一个也没创建,它也存在。 若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。利 用这个性质实现的全局变量和函数使用起来就很方便了。
值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。 例如:
(1)添加一个没有基类的新类,类名为CMyPublicData。
单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CMyPublicData”,单击“OK”,新类建立完毕。
(2)包含公用类的头文件,使各个类都能访问它。
CMyPublicData的头文件应包含在应用程序类的头文件中,这样在其它类中引用CMyPublicData类时就不需要再包含了。
Test.h:(应用程序类头文件)
#include \包含公用类头文件 class CTestApp: public CWinApp {……};
(3)在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化。 CMyPublicData.h(公用类头文件)
在公用类中对静态变量进行初始化和定义函数体: CMyPublicData.cpp(公用类程序文件)
int CMyPublicData::Public_x = 0; //初始化全局变量
void CMyPublicData::f(int y) //全局函数,这里不再加static (4)全局量的使用
可利用CMyPublicData::Public_x和CMyPublicData::Public_f()使用变量和函九。 如在视图的某函数中访问变量Public_x和函数Public_f()。 void CTestView::xxx(){
CMyPublicData::Public_x = 0; //访问变量Public_x CMyPublicData::Public_f(); //访问函数Public_f() ……}
在其它类中访问Public_x和Public_f()的方法与此相同。
(5)几点注意:由于静态量可独立于类存在,不需要生成CPublic类的实例;静态数据成员的定义和初始化必须在类外进行,如例中 Public_x的初始化。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。
总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。
5 结束语
从严格意义上讲,以上这种变量和函数并不是全局的。只是通过定义类中的成员变量和成员函数方式实现。当然,除非在必要情况下,全局量还是少用 为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时带来一些麻烦。
2