一、在应用程序类中定义
用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()可以视作为全局的。
用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。
既然用MFC,你就不应该想到用什么全局函数。不过你问到了,还是给你说下,MFC程序应该有个全局变量,叫做 theApp ,你看它是定义在哪里的,你紧跟它定义一个函数,不就是一个全局函数了吗。可以定义成静态函数,用 static 关键字,比如在类A中定义静态函数 Fa
class A
{
public:
static int Fa()
}
可以在类B中用下面的方法直接调用:
class B
{
int n
n=A::Fa()
}
另外,全局的库函数是Afx开头的,自定义的全局函数可以不用Afx开头,而且最好不要用,免得让人误以为这是库函数。
MFC框架下,设置全局变量有几种方法,其中,第一种是推荐用法:
作为APP类的成员函数。APP类是全局唯一的,它的成员函数也具有全局性和任意位置可访问的性质。访问方法:((CYourApp *)AfxGetApp())->你的数组
作为mainframe类成员函数(或者主对话框类成员函数),这个也具有全局唯一性,可以通过AfxGetMainWnd访问,和方法一类似。
在全局包含的.h中声明你的变量(数组),如CYourApp.h、stdafx.h,这里声明的变量,全局可访问,但在可控和安全性上差一些。
使用extern方法。这是传统C的处理方式,和C++类的封装、继承概念有些冲突,但同样是可以实现的,不推荐使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)