MFC中怎么定义全局变量? mfc中如何定义全局变量和全局函数

作者&投稿:广春 (若有异议请与网页底部的电邮联系)
  用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。
  一、在应用程序类中定义

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

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

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

  class CTestApp : public CWinApp + i; Q+ }

  public:
  int x; //全局变量
  int f(int y); //全局函数 ) X s+ s' N+ U
  …………
  Test.cpp:(应用程序类程序文件)

  int CTestApp::f(int y) //全局函数定义
  {
  定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():
  void CTestView::xyz()
  {
  CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针 /  app
  int z = app->f(1); //访问函数f() 0 R,
  }

  这样,变量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; //全局变量 % v
  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++; 4
  return y;
  } 3 O2 V% Z6 r+ r( k! L

  4、全局量的使用

  使用变量:CPublic::变量名6 H)

  使用函数: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类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。  这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。

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

写在任何类外的cpp里,若其他文件需要引用,则用extern 声明,如1.cpp:int A;
2.cpp需要用它:extern int A;

你可以在StdAfx.cpp里定义
变量
,如
int
aaa
=
0;
在StdAfx.h里extern
int
aaa;
这样你就可以在所有包含#include
"stdafx.h"文件中使用aaa变量了。

你调用对话框的时侯,可以把这个变量传给对话框啊。如果使用值传递,再return回来不就得了。

一定要用全局变量的话,在view的cpp中
int a;
在dialog的cpp中extern int a;
这样就好了。

你把要让对话框操作的数据作为对话框的参数传进去就行了.
具体的,需要修改对话框的构造函数.

例如: CMyDailog( CWnd* pParent = NULL);
原来的构造函数.
改写为:
CMyDialog( char *MyData, CWnd *pParent = NULL );
就可以通过MyData参数把数据传入对话框,当然,具体传什么类型的数据,自己修改.

在MFC中如何定义全局变量?如何引用它?~

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

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

仅供参考:
1、全局一般是针对变量而言,在函数外声明的都属于全局变量
2、函数的话只要包含对应的头文件就可以使用

TIA Portal BD,FC,FB都是做什么的
答:简单说,DB是数据块,存数据,里面定义各种各样的变量。FC和FB都相当于函数或者子程序,区别是FC的变量是局部变量,用完就丢了,而FB有对应的背景数据块(其实就是一个数据块,数据块中的数据是一直在的,相当于全局变量了)。一般应用中来说,普通的函数或者子程序,用FC就够了。一些特殊情况下,...

fc金手指代码如何查询?
答:// 在这1页内存中查找 DWORD* pdw;for(int i=0; i<(int)4*1024-3; i++){ pdw = (DWORD*)&arBytes[i];if(pdw[0] == dwValue) // 等于要查找的值?{ if(g_nListCnt >= 1024)return FALSE;// 添加到全局变量中 g_arList[g_nListCnt++] = dwBaseAddr + i;} } return ...

在main之前,IAR都做了啥
答:也就是说,IAR在每次系统复位后,都会自动将我们定义的全局变量清零0。清零完毕后,接下来的指令"LDR R2, [R0], #0x4"将R0指向的地址——0x0800'7C84中的值——0加载到R2寄存器,然后R0中的值自加4,更新为0x0800'7C88。随后检查R2是否为0,这里R2为0,执行'BX LR'返回到__iar_data_init2函数,若是不为...

C语言初级问题
答:1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)―,全局变量...

fc块不调用后,里面的数据会不会清
答:在程序中使用free释放,否则该段内存不会被释放掉就是不会被清除,C语言不会释放。所谓动态内存,是由malloc系列函数进行申请的内存,除非在程序中使用free释放,否则该段内存不会被释放掉。标准库中malloc函数的实现原理。C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能...

静态变量是属于:A.全局变量.B.局部变量C.可变变量D常量
答:在这些程序语言中通常不使用“静态变量”这一术语,而直接以“全局变量”代之。一般来说,在这些程序语言中,静态变量就是全局变量,而即使在有明确区分全局和静态变量的程序语言中,在编译后的代码里二者也以相同的方式获取存储空间。而今术语“静态变量”的概念则主要基于C族语言的“static”的定义 ...

模块Ps219A4与sDM20G60Fc可代用吗
答:模块,又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体)。它具有两个基本的特征:外部特征和内部特征。外部特征是指模块跟外部环境联系的接口(即其他模块或程序调用该模块的方式,包括有输入输出参数、引用的全局变量)和模块的功能;内部特征是指模块的内部...

c++程序编译后自动生成的文件有什么用,分别解释下
答:这里的符号一般是指函数名及变量(局部、全局)。根据这个地址信息,便可以把地址翻译成相应的符号,很多系统工具、debug方法都要用到这种信息。 (一)一个程序编译完以后内容会分成两大类保存,一类是code,一类是data:(1)code指程序代码,常存在.text section(2)data指存程序中声明的变量,常存在.data section,未初始...

堆,栈,堆栈的区别 .
答:一个程序一般分为3段:text段,data段,bss段 text段:就是放程序代码的,编译时确定,只读,data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写 就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域 bss段:定义而没有赋初值的全局变量和静态变量,放在...

如何用excel画楼梯?
答:软件:Office 2007 方法:1、如果是楼梯的侧面图,可以全选文档---右键”设置单元格格式“将背景填充为白色,2、之后,将单元格列宽缩小,之后选中两个单元格,填充黑色,向下,依次递增。3、如果是正面楼梯图,可以将单元格列宽设置为16,行高30 ;之后右键”设置单元格格式“填充--填充效果---双色,...