• 注册
  • 关于作者
    企业认证:趣记站长
    关注 6 粉丝 4 喜欢 9 内容 992
    江西省·南昌市
    聊天 送礼
    • 查看作者
    • 在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声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。

        利用这个性质实现的全局变量和函数使用起来很方便。

        值得注意的是,全局变量和全局函数最好集中封装,

      基于Visual C++6.0的DLL编程实现
      VC++中利用/GS开关防止缓冲区溢出,VC实现系统热键激活后台服务程序,用Visual C++干干净净地清除进程,用Visual C++设计屏幕抓图程序,在VC中为应用程序添加图形超链接功能,详解Visual C++ 2005中的突破性变化,用VC++制作播放AVI视频流的动画按钮,在程序的状态栏中实现进度条,利用Visual C++设计自己的资源浏览器,VC++动态链接库编程之DLL木马,VC++编程实现对火焰的计算机动态仿真,VC中利用多线程技术实现线程之间的通信,利用OpenGL实现三维绘图,基于Visual C++的Winsock API研究,基于Visual C++6.0的DLL编程实现,Visual C++ MFC 中常用宏的含义,在MFC下如何定义全局变量和全局函数,使用MFC在应用程序中嵌入MS Word,VC++中进程与多进程管理的方法,Visual C++6.0 API函数操作技巧集
      Visual C++

      不要在文档、视图等类内部定义,这样用起来才有全局的感觉。

        例:

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

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

      基于Visual C++6.0的DLL编程实现
      VC++中利用/GS开关防止缓冲区溢出,VC实现系统热键激活后台服务程序,用Visual C++干干净净地清除进程,用Visual C++设计屏幕抓图程序,在VC中为应用程序添加图形超链接功能,详解Visual C++ 2005中的突破性变化,用VC++制作播放AVI视频流的动画按钮,在程序的状态栏中实现进度条,利用Visual C++设计自己的资源浏览器,VC++动态链接库编程之DLL木马,VC++编程实现对火焰的计算机动态仿真,VC中利用多线程技术实现线程之间的通信,利用OpenGL实现三维绘图,基于Visual C++的Winsock API研究,基于Visual C++6.0的DLL编程实现,Visual C++ MFC 中常用宏的含义,在MFC下如何定义全局变量和全局函数,使用MFC在应用程序中嵌入MS Word,VC++中进程与多进程管理的方法,Visual C++6.0 API函数操作技巧集
      Visual C++

    • 0
    • 0
    • 0
    • 58
    • 单栏布局 侧栏位置: