使用Visual C++6.0 中的MFC 基本应用时, 由于

MFC 制作的工程由很多文件构成, 它不能象一般C++程序那样随意在类外定义全局变量, 那样有时会在运行程序时出现问。

在软件开发过程中, 有时需要在不同的类之间利用全局变量传递数据, 利用全局函数处理相同问题, 而MFC 没有提供类似其他开发

工具的模块功能, 因此我们只得自己完成。实际上有多种方法可以实现, 这里介绍三种常用的方法。

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

其实生成这个自定义类对象, 我们可以完全参照theApp 对象的生成方式[1- 2], 自定义一个CMyPublicData 的全局类。然后生

成CMyPublicData 全局对象, 通过对象调用全局变量及全局函数。

实现过程如下:

(1)添加一个没有基类的新类, 设类名起为CMyPublicData, 可称之为公用类。

单击“Insert”菜单下的“New Class”命令, 选择“Class type”为

“Generic Class”, 在“Name”栏中填入类名“CMyPublicData”, 单击

“OK”, 则新类建立完毕。

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

实际上是定义CMyPublicData 类的public 属性的成员变量和

成员函数。

CMyPublicData.h 的内容:

class CMyPublicData

{public:

CMyPublicData(void);

public:

virtual ~CMyPublicData(void);

public:

int Public_x;

//自定义了一个int 型全局变量Public_x

void Public_f();

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

};

extern CMyPublicData MyPublicData; //这里声明了自定义全局对象

CMyPublicData.cpp 的内容:

#include "StdAfx.h"

#include "CMyPublicData.h"

CMyPublicData::CMyPublicData(void)

{}

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

CMyPublicData::~CMyPublicData(void)

{}

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

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

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

CMyPublicData 的头文件应包含在应用程序类的头文件中,

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

应用程序类的头文件为Example.h, 其样式如下:

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

class CTestApp : public CWinApp

{⋯⋯};

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

可在整个工程中, 利用MyPublicData.Public_x 形式使用变量,

可多次赋值, 多次调用, 利用MyPublicData.Public_f()形式调用函

数。可实现了全局变量和全局函数。

2、利用应用程序类中定义实现

用MFC 生成的工程中都有一个名为CxxxApp 的类, 其中xxx一般为应用程序名, 它继承了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() //全局函数定义

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

定义在CTestApp 类中的变量和函数可以在其它类中被访问。

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

void CTestView::xxx(){CTestApp *app = (CTestApp *)AfxGetApp(); //得到指向应用程序类的指针

app- >Public_x = 0; //访问变量Public_xapp- >Public_f(); //访问函数f()⋯⋯}这样, 变量Public_x 和函数Public_f()可以视作为全的。以上两种方法可实现的全局变量和全局函数的运用。

虽比较简单, 但也有缺点, 二者都是定义的成员变量和成员函数, 在使用函数时, 都要隐式地传递this 指针。

这样, 有可能对类中的成员不必要的影响。而第二种方法, 每次都需要获取应用程序类的指针,这样做比较麻烦。

再就是把一些与应用程序类本身无关的变量和函数放在里面, 使这个类看上去怪怪的, 破坏了类的封装。

3、利用静态变量和静态函数实现静态变量和静态函数有如下性质:

若在一个类中用关键字static 声明数据成员, 则这个数据成员就只存在一个拷贝, 无论该类创建了多少个实例,

它始终只存在一个, 即使该类的实例一个也没创建, 它也存在。

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

值得注意的是, 全局变量和全局函数最好集中封装, 不要在文档、视图等类内部定义, 这样用起来才有全局的感觉。

例如:(1)添加一个没有基类的新类, 类名为CMyPublicData。单击“Insert”菜单下的“New Class”命令, 选择“Class type”为“Generic Class”, 在“Name”栏中填入类名“CMyPublicData”, 单击“OK”, 新类建立完毕。

(2)包含公用类的头文件, 使各个类都能访问它。CMyPublicData 的头文件应包含在应用程序类的头文件中,这样在其它类中引用CMyPublicData 类时就不需要再包含了。

Test.h:( 应用程序类头文件)#include "CMyPublicData.h" //包含公用类头文件class CTestApp: public CWinApp{⋯⋯};

(3)在公用类中定义全局变量和全局函数, 均使用static 修饰,静态变量还必须在类外定义和初始化。

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)全局量的使用可利用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 类的实例,所以它的构造函数和析构函数都不会被执行, 在里面做什么工作都没有什么意义。

总之, 用没有实例的类管理全局量是一个不错的选择, 它具有集中管理, 使用方便的好处。4、

结束语从严格意义上讲, 以上这种变量和函数并不是全局的。

只是通过定义类中的成员变量和成员函数方式实现。

当然, 除非在必要情况下, 全局量还是少用为好, 一个好的编程者决不会随意滥用全局量的,

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

MFC中定义全局变量和全局函数的方法相关推荐

  1. 在vue项目中定义全局变量和全局函数

    如题,在项目中,经常有些函数和变量是需要复用,比如说网站服务器地址,从后台拿到的:用户的登录token,用户的地址信息等,这时候就需要设置一波全局变量和全局函数 定义全局变量 原理: 设置一个专用的的 ...

  2. MFC下如何定义全局变量和全局函数

    MFC下如何定义全局变量和全局函数 用MFC制作的工程由很多文件构成,它不能像一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行.实际 ...

  3. C++中如何访问全局变量和全局函数

    全局变量和全局函数是相对局部变量和局部函数而言的,不在{}或者for, if 等范围内的都是全局变量或者全局函数,最简单的是在同一个文件中去声明. 例如在mian.cpp中 #include < ...

  4. html引用c 变量,在jsp页面中定义全局变量,供其他页面引用

    一.在一个jsp中引用另一个jsp的方法有: 1.使用 jsp include指令(常用): file属性是必填的(绝对或相对路径),但它不支持任何的表达式,也不允许通过?挂参方式来传递参数. 注意: ...

  5. 在JavaScript函数中定义全局变量

    是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...

  6. vue项目中定义全局变量、函数的几种方法

    定义全局变量 原理:使用模块(.js或.vue文件)来管理全局变量,最后使用export暴露出去 (最好导出的格式为对象,方便在其他地方调用),当其它地方需要使用时,用import导入该模块 1.使用 ...

  7. js定义全局变量 vue页面_vue项目中定义全局变量、函数的几种方法

    前言 在项目中,经常会复用一些变量和函数,比如用户的登录token,用户信息等.这时将它们设为全局的就显得很重要了,全局变量和全局函数之间有一些相通之处,它们其实很简单,但是有些人可能还不太了解.简单 ...

  8. c语言中的全局变量类型,c++全局变量 C/C++中定义全局变量的几种方法及区别

    c语言中全局变量主要是定义在所有函数之外的变量,在程序执行的过程中一直有效,可以被任何函数引用.赋值,想要定义它,一般将其定义在主函数main()之外就行. 例如下面的程序段,变量m就是一个全局变量, ...

  9. 能不能在头文件中定义全局变量?

    首先,这是一篇科普文,所以 比较杂,我尽量写清楚一些. 1.ANSI C标准是什么?GNU又是什么?ld是什么? ANSI C是C语言的标准规范,是国际标准化组织制定的国际标准. 虽然 ANSI C规 ...

最新文章

  1. HDLC和 PPP的实验
  2. CListCtrl的使用完全指南
  3. 如何用 Python + Scrapy 爬取视频?
  4. windows中VS卸载opencv配置,重新安装其他版本
  5. mysql select array_从数据库select查询出来的数组
  6. redis本地及远程登录
  7. 记一次ElasticSearch重启之后shard未分配问题的解决
  8. sqlite主键会加速吗_股指分歧中创下3107新高,权重主动下蹲蓄势,后市会加速吗?...
  9. 智能优化算法——遗传算法原理(附代码)
  10. R 语言 iris 数据集的可视化
  11. Java开发的第一个开源项目
  12. 学习笔记-网络安全(二)
  13. python负数字符串转成_python 转字符
  14. Quartus 软内核NIOS II 入门指导
  15. 基于Python的A-Priori算法发现购物篮关联规则
  16. matlab多重比较lsd法,多重比较法-LSD I 附赠统计学最全思维导图~
  17. 高通平台耳机类型识别
  18. python展望_python学习的一点随想与展望
  19. Maltrail恶意流量检测系统
  20. Linux 挂载nas盘

热门文章

  1. OSS 下载延迟或超时
  2. 『中级篇』docker之wordpress容器SSL(番外篇)(78)
  3. Caused by: java.lang.ClassNotFoundException: javax.persistence.Entity
  4. MySql中启用InnoDB数据引擎的方法
  5. 如何将视频网站中的视频插入到博客中
  6. AliOS Things KV组件的写平衡特性
  7. ASA用ASDM管理时报unable to launch device manager xxx.xxx.xxx.xxx
  8. 如何让squid实现动态缓存
  9. Java使用Jdbc操作MySql数据库(一)
  10. JVM的GC简介和实例