在MFC下如何定义全局变量和全局函数.doc_第1页
在MFC下如何定义全局变量和全局函数.doc_第2页
在MFC下如何定义全局变量和全局函数.doc_第3页
在MFC下如何定义全局变量和全局函数.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在MFC下如何定义全局变量和全局函数用MFC制作的工程由很多文件构成,它不能象一般C+程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。 9 h& q& 8 U9 J# n ( 3 G; 3 G1 E R- c: w/ h一、在应用程序类中定义0 l6 I5 ( ) H& c! S& u用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。5 M; Q. i K0 _( x3 s; B从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视 图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用 “AfxGetApp()-成员”访问变量或函数。( S3 E3 w, m! a; A例:0 H: u9 t6 rTest.h:(应用程序类头文件)class CTestApp : public CWinApp + i; Q+ 0 P& a% 0 b* n 2 XF6 W* s1 d2 t( 8 B, G# vpublic: ) 4 l5 ?4 O% R) U* g4 : p- int x; /全局变量int f(int y); /全局函数 ) Xs+ s N+ U; ! z4 9 d3 Y. b3 d! B+ R! D0 g3 u! r) y% I q! dTest.cpp:(应用程序类程序文件) z8 b% C3 |; P. y2 % Cint CTestApp:f(int y) /全局函数定义 - O6 5 D: V# t , p* 2 m! T; n/ B/ b( hy+; : $ _* B M+ Z0 v/ m; Treturn y; + u# |# D d0 . Q( D! z M 6 k% m7 D W& ) wE8 O# O+ H$ U G0 f# l定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():/ a/ h* l4 / 0 S2 Dvoid CTestView:xyz() CTestApp *app = (CTestApp *)AfxGetApp(); /生成指向应用程序类的指针 / T# U6 % Q- & lapp-x = 0; /访问变量x int z = app-f(1); /访问函数f() 0 R, b% b u$ ( F) X8 n% 4 fw; l: Rn/ A1 d7 o # P2 * L* , R J2 At6 _: C9 a% 0 F这样,变量x和函数f()可以视作为全局的。% ) I/ x- u# a用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。 / B6 h7 x$ I9 J% 0 V3 t! P二、用静态变量和静态函数实现, % J1 k4 f4 B+ ( l# a% q- U! r很喜欢API函数的那种调用方法,不论在哪个类中只要用“:API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。静态变量和静态函数有如下性质:2 S! z+ O6 v7 5 T若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。* x) S4 j/ b) u- k/ r- P, p3 X; G5 ME3 pI* H若在一个类中用关键字static声明函数,该函数可以用“类名:函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。( z , e v6 o2 W _) V利用这个性质实现的全局变量和函数使用起来很方便。( R* i2 l4 p9 . y7 O值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。例:1 w, t) P$ z% e3 O5 5 6 Q1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类 $ p1 |! % P% n9 ) ?$ ?单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。 N6 H9 L5 8 P8 J4 s X2、包含公用类的头文件,使各个类都能访问它7 c- P) v- K+ R$ q) p- F- z) o. H/ E; h9 a. dCPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。4 _o7 E0 p* pTest.h:(应用程序类头文件)) J. s0 a+ ( T+ g( p9 |#include Public.h /包含公用类头文件% i+ b9 x7 t! t+ k- A4 w$ H- ! r6 Y! A6 y4 c* Oclass CTestApp : public CWinApp ; 3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化Public.h:(公用类头文件)class CPublic |7 R! A7 5 t9 Lpublic: 3 Y f5 w2 o/ d- o! w6 U6 NCPublic();virtual CPublic();1 p$ B# V+ t7 N4 w$ j- D3 ?/ o! D6 K5 W) J9 s- y1 hpublic:% : ?0 E7 W8 d/ / 6 v: static int x; /全局变量 % v, M( o3 N6 I: - S4 t# Ustatic int time; /全局变量 # u# - J: f# g6 v% Y0 Wstatic int f(int y); /全局函数 7 Y7 c2 T3 ) I4 L9 7 D, i( L; T. f在公用类中对静态变量进行初始化和定义函数体:8 _$ j1 j# C# 8 BPublic.cpp:(公用类程序文件)4 c, ( F; 8 E/ a- By- jint CPublic:x = 0; /初始化全局变量 7 F8 c! a7 d$ Q, jint CPublic:time; /定义全局变量 4 sI/ C5 M* F, X1 S7 N/ S+ Y1 D1 u( x4 Dp% ! v9 NCPublic:CPublic() % A2 1 1 O! q6 I N0 Z CPublic:CPublic() $ K& Z O0 m* f6 - s + l w. E$ s! b+ x& int CPublic:f(int y) /全局函数,这里不要再加static * : r |% _% P. 7 H+ E% i3 Ay+; 4 e1 A9 ?( x/ - g: U2 J4 ereturn y; 3 O2 V% Z6 r+ r( k! L4、全局量的使用使用变量:CPublic:变量名6 H) G+ w) |- H& a使用函数:CPublic:函数()2 , p# A l6 0 y% z如在视图的某函数中访问变量x和函数f():3 r. & J; 5 f& e* h% $ w- void CTestView:xyz() ( 9 t7 ; t! O3 D! |B& E* U2 uCPublic:x = 0; /访问变量x; p$ I0 / c% , p* E& v7 S$ NCPublic:time = CPublic:f(1); /访问函数f() K: : E9 f* q. & X! * v- A u4 X* 1 J0 d9 e6 gb3 n. X7 R2 X+ V在其它类中访问x、time和f()的方法与此相同。5、几点注意: 1 n N: f 6 y7 Q& UN1 h 由于静态量可独立于类存在,不需要生成CPublic类的实例。9 . n1 ?9 I$ oj6 U8 u& d+ i; s 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。 如:class CPublic 0 g/ 9 J, H1 _ public: * 9 8 K, |) h w/ iint x; /内部变量static int f(int y) /全局函数8 Y7 E v. I4 c% - T8 S 2 l* g! |: ! P# s5 x+; # k# O; B1 u7 Z Xreturn x; ; p3 x# 5 V4 C ; +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论