1 引言


MFC 制作的工程由很多文件构成, 它不能象一般C++程序那样随 意在类外定义全局变量, 那样有时会在运行程序时出现问题。在 软件开发过程中, 有时需要在不同的类之间利用全局变量传递数 据, 利用全局函数处理相同问题, 而MFC 没有提供类似其他开发 工具的模块功能, 因此我们只得自己完成。实际上有多种方法可 以实现, 这里介绍三种常用的方法。

2 定义一个全局类的对象来实现


象的生成方式[1- 2], 自定义一个CMyPublicData 的全局类。然后生 成CMyPublicData 全局对象, 通过对象调用全局变量及全局函数。


实现过程如下:

称之为公用类。
 
“Generic Class”, 在“Name”栏中填入类名“CMyPublicData”, 单击 
 “OK”, 则新类建立完毕。
 

  (2)创建全局的变量与全局函数 

 
成员函数。
 

  CMyPublicData.h 的内容: 

 

  class CMyPublicData 

 

  {public: 

 

  CMyPublicData(void); 

 

  public: 

 

  virtual ~CMyPublicData(void); 

 

  public: 

 
//自定义了一个int 型全局变量Public_x
 
//自定义了一个返回值类型void 无任何参数的全局函数Public_f
 

  }; 

 
局对象
 

  CMyPublicData.cpp 的内容: 

 

  #include "StdAfx.h" 

 

  #include "CMyPublicData.h" 

 

  CMyPublicData::CMyPublicData(void) 

 

  {} 

 

  CMyPublicData MyPublicData; //实例化全局对象 

 

  CMyPublicData::~CMyPublicData(void) 

 

  {} 

 

  void CMyPublicData::Public_f()//函数的定义 

 

  {//此处可增加函数完成实际功能的语句}


(3)包含公用类的头文件, 使各个类都能访问它


这样在其它类中引用CMyPublicData 类时就不需要再包含了。若 应用程序类的头文件为Example.h, 其样式如下:


#include "CmyPublicData.h" //包含公用类头文件 

 

  class CTestApp : public CWinApp 

 

  {??};

(4)使用全局变量和全局函数


可多次赋值, 多次调用, 利用MyPublicData.Public_f()形式调用函 数。可实现了全局变量和全局函数。


3 利用应用程序类中定义实现


一般为应用程序名, 它继承了CWinApp 类。CxxxApp 类主要进行 程序的初始化, 生成文档、视图对象等工作。我们可以把需要全局 访问的变量和函数定义为这个类的成员变量和成员函数。由于我 们很容易获得CxxxApp 类的指针, 所以可以在文档、视图、对话框 以及各种自定义类中访问到它们, 达到与全局变量类似的果。 访问时用函数“AfxGetApp()”获得CxxxApp 类的指针, 用“AfxGetApp()- >成员”访问变量或函数[2- 3]。


例: 在Example.h 头文件中( Example.h 为应用程序类头文件) 

 

  class CTestApp: public CWinApp { 

 

  public: 

 

  int Public_x; //全局变量 

 

  void Public_f(); //全局函数 

 

  ??}; 

 

  Example.cpp:( 应用程序类程序文件) 

 

  void CTestApp::Public_f() //全局函数定义 

 

  {//此处可增加函数完成实际功能的语句} 

 
问。比如在视图的某函数中要访问变量Public_x 和函数Public_f():
 

  void CTestView::xxx() 

 
程序类的指针
 

  app- >Public_x = 0; //访问变量Public_x 

 

  app- >Public_f(); //访问函数f() 

 

  ??}


这样, 变量Public_x 和函数Public_f()可以视作为全局的。


简单, 但也有缺点, 二者都是定义的成员变量和成员函数, 在使用 函数时, 都要隐式地传递this 指针。这样, 有可能对类中的成员不 必要的影响。而第二种方法, 每次都需要获取应用程序类的指针, 这样做比较麻烦。再就是把一些与应用程序类本身无关的变量和 函数放在里面, 使这个类看上去怪怪的, 破坏了类的封装。


4 利用静态变量和静态函数实现


静态变量和静态函数有如下性质:


员就只存在一个拷贝, 无论该类创建了多少个实例, 它始终只存 在一个, 即使该类的实例一个也没创建, 它也存在。


名::函数名”方式访问, 无需引用该类的实例, 甚至这个类的实例 可以不存在。利用这个性质实现的全局变量和函数使用起来就很 方便了。


文档、视图等类内部定义, 这样用起来才有全局的感觉。


例如:


(1)添加一个没有基类的新类, 类名为CMyPublicData。


“Generic Class”, 在“Name”栏中填入类名“CMyPublicData”, 单击 
 “OK”, 新类建立完毕。
 

  (2)包含公用类的头文件, 使各个类都能访问它。 

 
这样在其它类中引用CMyPublicData 类时就不需要再包含了。
 

  Test.h:( 应用程序类头文件) 

 

  #include "CMyPublicData.h" //包含公用类头文件 

 

  class CTestApp: public CWinApp 

 

  {??}; 

 
静态变量还必须在类外定义和初始化。
 

  CMyPublicData.h( 公用类头文件) 

 

  class CMyPublicData { 

 

  public: 

 

  CMyPublicData (); 

 

  virtual ~CPublic(); 

 

  public: 

 

  static int Public_x; //全局变量 

 

  static void Public_f(); //全局函数 

 

  ??} 

 

  在公用类中对静态变量进行初始化和定义函数体: 

 

  CMyPublicData.cpp( 公用类程序文件) 

 

  int CMyPublicData::Public_x = 0; //初始化全局变量 

 

  void CMyPublicData::f(int y) //全局函数, 这里不再加static 

 

  {} 

 

  (4)全局量的使用 

 
使用变量和函九。
 

  如在视图的某函数中访问变量Public_x 和函数Public_f()。 

 

  void CTestView::xxx(){ 

 

  CMyPublicData::Public_x = 0; //访问变量Public_x 

 

  CMyPublicData::Public_f(); //访问函数Public_f() 

 

  ??}


在其它类中访问Public_x 和Public_f()的方法与此相同。


CPublic 类的实例; 静态数据成员的定义和初始化必须在类外进 行, 如例中Public_x 的初始化。由于没有生成CPublic 类的实例, 所以它的构造函数和析构函数都不会被执行, 在里面做什么工作 都没有什么意义。


有集中管理, 使用方便的好处。


5 结束语


过定义类中的成员变量和成员函数方式实现。当然, 除非在必要情


量的, 一个封装做得不好的程序, 在修改维护时带来一些麻烦。


1。在一类的.cpp中定义 int myInt;
然后再在要用到的地方的.cpp里extern int myInt;这样就可以用了。

2。在stdafx.cpp中加入:
int myInt;
然后在stdafx.h中加入:
extern int myInt
这样定义以后无论在什么文件中都是可见的.

3。比较规范的是,先定义一个Glbs.h,把所有的全局变量原始定义放进去。然后定义一个Externs.h,把你先前定义在Glbs.h中的变量都加上extern。注意:如果你在Glbs.h中设置了初值,那么在Externs.h中就不要加值了。然后调用时,第一次调用的#i nclude <Glbs.h>,以后调用的#i nclude <Externs.h>


但不建议上面的做法,最好,将所有变量封装到一个类中,然后将这个类的实现设成全局的。这样包装最大的好处是便于管理。