C++中的mfc学习之MFC中全局变量的定义及使用(转)

C++中的mfc学习之MFC中全局变量的定义及使用(转)

2023年7月18日发(作者:)

C++中的mfc学习之MFC中全局变量的定义及使⽤(转)

⽤MFC制作的⼯程由很多⽂件构成,它不能象⼀般C++程序那样随意在类外定义全局变量,在这⾥要想定义能被⼯程内多个⽂件共享的全局变量和函数必须⽤⼀些特殊⽅法才⾏。实际上有多种⽅法可以实现,这⾥只介绍两种⽅法。⼀、在应⽤程序类中定义⽤MFC⽣成的⼯程中都有⼀个名为CxxxApp的类,它派⽣于CWinApp类。这个类主要进⾏程序的初始化,⽣成⽂档、视图对象等⼯作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在⽂档、视图、对话框以及各种⾃定义类中访问到它们,达到与全局变量类似的效果。访问时⽤函数“AfxGetApp()”获得CxxxApp类的指针,⽤“AfxGetApp()->成员”访问变量或函数。例:Test.h:(应⽤程序类头⽂件)class CTestApp : public CWinApp

{

public:

int x; //全局变量

int f(int y); //全局函数

…………

};:(应⽤程序类程序⽂件)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); //全局函数

…………

}在公⽤类中对静态变量进⾏初始化和定义函数体::(公⽤类程序⽂件)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不存在的问题。总之,⽤没有实例的类管理全局量是⼀个不错的选择,它具有集中管理,使⽤⽅便的好处。当然,除⾮特别必要,全局量还是少⽤为好,⼀个好的编程者决不会随意滥⽤全局量的,⼀个封装做得不好的程序,在修改维护时会让你吃⾜苦头

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689609650a270334.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信