文章转载自http://www.programfan.com/article/2894.html

用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。

  一、在应用程序类中定义

  用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。

  从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用“AfxGetApp()->成员”访问变量或函数。

  例:

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

class CTestApp : public CWinApp 

 public: 
  int x; //全局变量
  int f(int y); //全局函数 
  …………
};

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

int CTestApp::f(int y) //全局函数定义 

 y++; 
 return y; 
}

  定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():

void CTestView::xyz()

 CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针 
 app->x = 0; //访问变量x 
 int z = app->f(1); //访问函数f() 
 …………
}

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

  用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。

  二、用静态变量和静态函数实现

  很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。

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

  若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。

  若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。

  利用这个性质实现的全局变量和函数使用起来很方便。

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

  例:

  1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类

  单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。

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

  CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。

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

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

class CTestApp : public CWinApp

………… 
};

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

  Public.h:(公用类头文件)

class CPublic
{
public: 
CPublic();
virtual ~CPublic();

public:
static int x; //全局变量 
static int time; //全局变量 
static int f(int y); //全局函数 
………… 
}

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

  Public.cpp:(公用类程序文件)

int CPublic::x = 0; //初始化全局变量 
int CPublic::time; //定义全局变量

CPublic::CPublic() 
{

}

CPublic::~CPublic() 
{

}

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

y++; 
return y; 
}

  4、全局量的使用

  使用变量:CPublic::变量名

  使用函数:CPublic::函数()

  如在视图的某函数中访问变量x和函数f():

void CTestView::xyz()

CPublic::x = 0; //访问变量x
CPublic::time = CPublic::f(1); //访问函数f()
…………
}

  在其它类中访问x、time和f()的方法与此相同。

  5、几点注意:

  ① 由于静态量可独立于类存在,不需要生成CPublic类的实例。

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

  ③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。 如:

class CPublic 

public: 
int x; //内部变量
static int f(int y) //全局函数

x++; 
return x; 
}; 
………… 
};

  这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。

  总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。

mfc中如何使用全局变量进行数据共享相关推荐

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

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

  2. MFC中通过Tooltip类来实现悬浮鼠标显示提示信息

    方法一: 利用CWnd本身自身支持的tooptip来实现,这种方法适用给控件增加tooltip,非常方便和简单方法如下: 1.在窗口中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, ...

  3. MFC中快速应用OpenCV(转)

    转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...

  4. 如何在MFC中使用cout和printf,输出到控制台

    在MFC中使用cout和printf,输出到控制台   在GUI程序中使用printf函数以及cout函数的方法: #include <io.h> #include <fcntl.h ...

  5. vs2019 MFC 中 cannot open include file 'afxres.h' 问题解决方法

    vs2019 MFC 中 cannot open include file 'afxres.h' 问题解决方法 使用Everything查找afxres.h文件,如果没有everything的,可以到 ...

  6. MFC中制作一个似命令行的输入框

    在做一个MFC软件的时候有一个这样的需求,就是要有类似与AutoCad的命令输入框,如下图所示: 本着不重写已有功能的原则,在MFC中发掘了一圈,没发现有可用的现成控件,上网搜了一下,发现有人做过,但 ...

  7. MFC中的几个常用类——CWnd

    2019独角兽企业重金招聘Python工程师标准>>> 1 窗口类 1.1 概述 CObject └CCmdTarget └CWnd CWnd是MFC窗口类的 基类,提供了微软基础类 ...

  8. MFC中OnInitDialog自动生成

    OnInitDialog是MFC中系统自动初始化界面的一个函数 那怎么写这个函数呢 在类视图中点击对应我们想要生成函数的地方 再在下面点击那几个图案中从右往左数第二个:重写 找到OnInitDialo ...

  9. 实现MFC中Radio Button组绑定同一变量控制

    实现MFC中Radio Button组绑定同一变量控制 总共有八个控件,如果要一个一个绑定变量,并且写响应函数,将要花费很多时间精力,所以想用的方法就是都绑上同一个变量,这样当我点击某一个控件的时候, ...

最新文章

  1. C语言中compile time assert的实现
  2. php wp foo,【翻译】WordPress WPDB SQL注入攻击(技术文档)
  3. 13种老人不适合带孩子_农村常见却叫上不上名字的13种野生植物,乡下长大的孩子都见过...
  4. uniapp h5 页面在移动端 遮罩层禁止滚动 --安卓和ios端完美适配(只是测试了部分机型)
  5. 分布式事务方案这么多,到底应该如何选型?
  6. CeontOS7安装ansible
  7. [工具]PyCharm激活、注册码无效解决办法
  8. 一些常见的js问题总结
  9. VTuber拍摄幕后:操作员、动捕设备、软件支撑
  10. 控制工程中的数学建模(1)——二阶有源低通滤波器(之一)
  11. php uchome,【UCHome二次开发】模板解析
  12. 2022全球C++及系统软件技术大会将于9月上海隆重召开,豪华嘉宾阵容揭晓
  13. java输出long最大值_Java调用long的最大值和最小值
  14. 寻找IT行业中的引爆点
  15. H2O中添加算法-模型训练篇
  16. 英语学习方法:我是怎么从高考英语115考到托福97的
  17. 2018年ACM-ICPC亚洲区域赛(焦作)赛后总结
  18. python进行谱曲_使用LSTM-GAN为歌词谱曲
  19. 不错的学习金字塔模型
  20. 阿里云的认证是不是最好的?考起来难不难?

热门文章

  1. python用户输入文字_python中用户输入的关键字
  2. js中的onload函数
  3. Linux中Kill进程的N种方法
  4. Java是什么软件-详细解答Java到底是什么
  5. XigmaNas系统(一):常见NAS系统选择比较
  6. 微信小程序识别图片并提取文字_这款微信小程序可以批量图片转文字?识别准确率超高!...
  7. 32位与64位系统基本数据类型的字节数
  8. 序列化解决方案,就是采用二进制通信协议(数据报文格式)
  9. VUE三目运算使用 :style与:class
  10. 读《经济学通识》薛兆丰