初涉MFC,你可能以为c++是一个纯面向对象的语言。天天都在和类打交道,似乎感觉缺了点什么。一天突然想添加全局函数和变量,顿时不知道该怎么办,后来查了点资料再认真思考了一下,原来很简单。下面我就简单讲讲我的心得把。
1.extern 声明法
全局函数和变量的概念在c里面最先提出来。那个时候,我们都只编写最简单的main函数,然后再加上2个调用函数,或者加上全局变量。这个时候的全局变量只针对这一个文件(.c
或者cpp)。不知道大家还记得吗?还有一个外部变量。它是应用于多源文件。方法就是使用extern对所要引用的外部变量进行声明就可以了,这样就使外部变量的作用域其他源程序文件中。现在回想起这段话,不正是和眼前的MFC多源程序相关么?
事实也正是如此。当你在MFC中想定义一个全局变量时,如在视类CmyView中定义一个全局变量 int a;可以这样做:
在CmyView的源文件的最前面加入:
int a;
如果现在想在文档类中调用,那么只需包含视类的头文件,并且在文档类的源文件中加入
extern int a ;
这样就和视类共享这样一个全局变量。
全局函数的方法也是同样,不多说明。
2.static成员法
第二种方法也很简单,只是有时候很难想到,就是定义一个静态成员函数或者变量。因为是静态的,也就是不属于任何对象,而是属于这个类,那么你就不用担心在另一个类中调用函数或者变量的时候怎样去构造一个原类的对象。呵呵,这种方法很巧妙把。
同上面那个例子:
在CmyView中加入一个静态成员变量:
static int a;
记得要初始化。
然后在文档类中引用
CmyView::a
即可。
这种方法经常用于创建线程函数。因为要创建一个线程函数的话,不能使它成为成员函数,因为调用的时候还需要创建对象,不方便。这个时候用静态成员函数就很适合。
3.CWinApp派生法
就是派生一个类,继承于CWinApp,再在里面定义函数或者变量。这个为什么也可以叫做全局变量呢?如:
class CmyApp::public CWinApp
{
Public:
int a;
}
其实想想又很简单,不是有个微软已经定义的全局函数AfxGetApp吗?呵呵,你明白了把。
CmyApp *app=(CmyApp*)AfxGetApp();
app->a=1;
这样随时随地都可以调用a了,不就是全局变量了吗?
评论