MFC中如何定义全局变量

转载 2012年03月29日 16:38:30
MFC中如何定义全局变量  

3种方法:1、在一个cpp文件中用extern声明,然后在其他文件中定义就可以用
                2、在**APP类中做公有变量,其他类中用AfxGetApp()得到一个App对象指针就可引用
                3、专门写一个全局类,里边的变量及方法全部声明为静态


具体说明如下(来自网络):

最好在.cpp   中声明,如果其它文件用到这个变量,就用extern   就行了   
    
  1.cpp   
  int   x   ;   
  ……   
    
  2.cpp   (用到了1.cpp   的   x)   
  extern   x;   
  ……   
    
  这样,你在2文件中就可以把   X   当全局变量来用了   
 ------------------------------------------------------------------------------   
 
  如果你在.h文件中声明,可就不好了   (好少会在.h文件中声明全局变量,你看一下   MFC   各种   .h   文件就知了)   
  比如当你的   .h   文件被两上文件包含:   
    
  My.h   
  int   y   ;   
    
  1.cpp   
  #include   "My.h"   
    
  2.cpp         
  #include   "My.h"   
    
  会出现什么错误,我就不说了,自己试一试吧。  




 ------------------------------------------------------------------------------ 


在   App   类中声明一个公有成员   
  在程序其它类中可以用   
  AfxGetApp()   得到一个App对象指针,将它转化成你的App类指针   
  然后就可以通过指针->变量使用了
  
如果你想自己和程序看上去"更面象对象一点",如楼上所说在CWinApp的子类中加公有变量.   
    
  如果你不在乎什么"面对对象",在StdAfx.h中做外部声明,在StdAfx.cpp中做声明.即   
  StdAfx.h   
    
  extern   int   g_nMyGlobal;   
    
  StdAfx.cpp   
  int   g_nMyBlobal;   
  
   ------------------------------------------------------------------------------ 
  一般全局变量在使用它地cpp文件中用:   
  extern   int   x;来声明。当然必须在某个cpp文件中有定义才行。     
    
  如果这些全局变量要在多个cpp文件种使用,可以考虑将声明放在一个头文件中以方便管理:   
  global.h:   
  extern   int   x;   
    
  global.cpp:   
  int   x;   
    
  a.cpp:   
  #include   global.h   
    
  b.cpp:   
  #include   global.h   
    
  看来你得多了解一下声明,定义得区别和编译单元得概念   
    
  总之记住:   
  变量的定义不要放在头文件中(虽然static   int   x是可以的),声明可以就行了.   
 
  变量声明;   
  extern   int   x;   
    
  变量定义:   
  int   x;   
  int   x   =   0;   
  static   int   x;   
  static   int   x   =   0;   
  extern   int   x   =   0;  


 ------------------------------------------------------------------------------ 


用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。


  一、在应用程序类中定义


  用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。


  从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用“AfxGetApp()->成员”访问变量或函数。


  例:


  Test.h:(应用程序类头文件)


class CTestApp : public CWinApp 

 public: 
  int x; //全局变量
  int f(int y); //全局函数 
  …………
};


  Test.cpp:(应用程序类程序文件)


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); //全局函数 
………… 
}


  在公用类中对静态变量进行初始化和定义函数体:


  Public.cpp:(公用类程序文件)


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不存在的问题。


  总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。  
举报

相关文章推荐

MFC中全局变量的定义及使用

举个例子,很快就明白: LoginDlg.cpp #include "stdafx.h" #include "LoginDlg.h" //下面在源文件cpp文件里定义了4个全局变量,包含了两个控件...

MFC中全局变量的定义及使用

MFC中全局变量的定义及使用 用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

MFC中如何定义全局变量

MFC中如何定义全局变量 3种方法: 1、在一个cpp文件中用extern声明,然后在其他文件中定义就可以用  2、全局类的对象来实现  3、在**APP类中做公有变量,其他类中用AfxGe...

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

用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种...

终于搞定了mfc声明全局变量

1、先建立一个基于对话框的工程,命名为test 2、在自定义一个类,用于封装全局变量和全局函数,如CPublic,基类随便定义吧,我用的是CDialog 3、在Public.h中Class P...

MFC-缩放位图

效果如图: 1.定义几个成员变量 CBitmap m_bitmap;//存放新的位图对象 CDC m_dc; //DC对象 CBitmap* m_pOldbmp;...

VC中extern的使用

extern为外部连接符号 通常是在定义接口(全局变量)的时候这样使用的,这样的一个声明写在头文件内,供其他文件包含。 这时候extern表示函数的实现部份不在文件内部,在连接的时候统一由连接器处理...

vc定义全局变量及extern用法

vc定义全局变量及extern用法 : 全局变量一般这样定义: 1。在一类的.cpp中定义 int myInt; 然后再在要用到的地方的.cpp里extern int myInt;这样就可以用...

cocos2dx replaceScene、popScene、pushScene的区别

replaceScene是在切换场景最常用的方法。虽然是会释放之前的场景,但是内存必须能够容纳下正在运行的场景和将要运行的场景。上一个场景是在切换后的场景加载完成后才进行释放。     pushSc...

Cocos2d-x Scene生命周期 pushScene和replaceScene

最近在开发过程中遇到很多切换场景的时候概率性崩溃,内存暴增的问题。 因此总结一些开发中需要注意的要点, 1. 切换全屏场景的时候最好使用replaceScene而不是pushSce...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)