欢迎来到天天文库
浏览记录
ID:41483614
大小:55.76 KB
页数:3页
时间:2019-08-25
《在mfc下定义全局变量和全局函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在MFC卜•如何定义全局变量和全局函数一、在应用程序类中定义用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。CTestApp*app=(CTestApp*)AfxGetAppO;//生成指向应用程序类的指针app->x=0;//访问变量xintz=app->f(1);//访问函数f()用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一
2、是访问不太方便,每次都需耍获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。二、用静态变量和静态函数实现API函数的那种调用方法,不论在哪个类中只耍用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。静态变量和静态函数有如下性质:若在一个类屮用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。若在一个类屮用
3、关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。利用这个性质实现的全局变量和函数使用起来很方使。三、集中封装1、添加一个没冇基类的新类,设类名起为CPublic,称Z为公用类。单击"Insert”菜单下的“NewClass”命令,选择“Classtype"为"GenericClass",在“Name”栏中填入类名“CPublic”,单击“0K”,则新类建立完毕。2、包含公用类的头文件,使各个类都能访问它CPublic的头文件应包含在应用程序类的头文
4、件中,这样在其它类中引用CPublic类时就不需要再包含了。Test,h:(应用程序类头文件)ttinclude"Public.h〃//包含公用类头文件classCTestApp:publicCWinApp};3、在公用类屮定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化Public,h:(公用类头文件)classCPublicpublic:CPublic();virtual^CPublic();public:staticintx;//全局变量staticinttime;//全局变量
5、staticintf(inty);//全局函数}在公用类屮对静态变量进行初始化和定义函数体:Public,cpp:(公用类程序文件)intCPublic::x=0;〃初始化全局变量intCPublic::time;//定义全局变量CPublic::CPublic(){}CPublic::^CPublic(){}intCPublic::f(intv)//全局函数,这里不要再加static{y++;returnv;}4、全局量的使用使用变量:CPublic::变量名使用函数:CPublic::函数()如在视图的某函数屮
6、访问变量x和函数f():voidCTestView::xvz(){CPublic::x二0;〃访问变量xCPublic::time=CPublic::f(1);//访问函数f()在其它类屮访问x、time和f()的方法与此相同。5、几点注意:①由于静态量可独立于类存在,不需要生成CPublic类的实例。②静态数据成员的定义和初始化必须在类外进行,如例屮x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么
7、意义。③如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。如:classCPublicpublic:intx;〃内部变量staticintf(intv)//全局函数{x++;rcturnx;};};这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。总Z,用没有实例的类管理全局量是一个不错的选择,它具冇集屮管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个
8、封装做得不好的程序,在修改维护吋会让你吃足苦头。三用namespace定义如在public.hnamespaceCPublic{doublea=1.02;doubleb=5.002;voidhello();}public.cppvoidsecond::hello(){std::cout<
此文档下载收益归作者所有