MFC 如何在一个类中使用在其他类中定义的变量或函数

【声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848】

【以下三种方法亲测有效,可以根据具体情况来选择哪一种】

三种方法可以实现这个功能:

  1,在使用该变量的cpp文件中用external声明,在其他类中定义;
  2,在**App类中定义为public变量,在其他类中通过AfxGetApp()函数得到一个App对象指针,通过对象指针来调用;
  3,专门写一个全局类,类里面的变量和方法都声明为static。

下面详细介绍一下这三种方式:

  第一种: 在一个cpp中声明,另外一个cpp中定义。
  对于两个类的cpp文件,比如在 A.cpp 中定义一个变量 int x ; 在 B.cpp 中需要使用变量x,那么只需要在B.cpp中用 extern int x声明外部变量就可以使用了。
  第二种: 在App类中声明一个public 成员,在其他类中使用AfxGetApp()函数得到App 对象指针,然后通过指针来访问。下面看个例子:

  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() 
   …………
  }
  第三种:利用static修饰变量。

例:
  1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类
  单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。

  2、在公用类中定义全局变量和全局函数,均使用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; 
  }

  2、包含公用类的头文件,使各个类都能访问它
  CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。

Test.h:(应用程序类头文件)
  #include "Public.h" //包含公用类头文件
  class CTestApp : public CWinApp
  {
  ………… 
  };

  4、全局量的使用
  使用变量:CPublic::变量名
  使用函数:CPublic::函数()
  如在视图的某函数中访问变量x和函数f():
  void CTestView::xyz()
  { 
    CPublic::x = 0; //访问变量x
    CPublic::time = CPublic::f(1); //访问函数f()
    …………
  } 
  在其它类中访问x、time和f()的方法与此相同。

原文地址:https://www.cnblogs.com/fpqi/p/9516388.html