在MFC下如何定义全局变量和全局函数.doc

上传人:pu****.1 文档编号:551021332 上传时间:2023-02-06 格式:DOC 页数:5 大小:35.51KB
返回 下载 相关 举报
在MFC下如何定义全局变量和全局函数.doc_第1页
第1页 / 共5页
在MFC下如何定义全局变量和全局函数.doc_第2页
第2页 / 共5页
在MFC下如何定义全局变量和全局函数.doc_第3页
第3页 / 共5页
在MFC下如何定义全局变量和全局函数.doc_第4页
第4页 / 共5页
在MFC下如何定义全局变量和全局函数.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《在MFC下如何定义全局变量和全局函数.doc》由会员分享,可在线阅读,更多相关《在MFC下如何定义全局变量和全局函数.doc(5页珍藏版)》请在金锄头文库上搜索。

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类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实

2、现全局访问了。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 XF

3、6 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#

4、 |# 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:

5、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函数”就可以调用了。合理利用静态类

6、型(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

7、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+

8、 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.

9、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); /全局函数

10、 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&

11、 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 CTestVie

12、w: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

13、 静态数据成员的定义和初始化必须在类外进行,如例中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 ; + e) S% c- x/ D1 g- z: B+ 8 I2 cL# R) 这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。2 B, f& K0 p& qD总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号