在MFC中如何定义全局变量,如何引用它? MFC中有一个C语言源文件,如何定义一个全局变量能让C程序和...

\u5728MFC\u4e2d\u5982\u4f55\u5b9a\u4e49\u5168\u5c40\u53d8\u91cf\uff0c\u5982\u4f55\u5f15\u7528\u5b83\uff1f

\u8be5ADO\u8fde\u63a5\u53d8\u91cf\u5b9a\u4e49\u5728\u54ea\u4e2a\u5934\u6587\u4ef6\u4e2d\uff1f\u8fd9\u4e2a\u5934\u6587\u4ef6\u662f\u5426\u5305\u542b\u8fdb\u6765\u4e86\uff08\u662f\u8bf4\u5728\u5f53\u524d\u4f7f\u7528\u8be5\u5bf9\u8c61\u7684\u6587\u4ef6\u4e2d\uff09\uff1f\u5efa\u8bae\uff1a\u6700\u597d\u4e0d\u8981\u5b9a\u4e49\u6210\u5168\u5c40\u53d8\u91cf\uff0c\u5c06\u5b83\u5b9a\u4e49\u4e3aAPP\u7c7b\u7684\u6570\u636e\u6210\u5458\u5c31\u53ef\u4ee5\u4e86\uff0c\u4ee5\u540e\u518d\u4efb\u610f\u6587\u4ef6\u4e2d\u53ea\u9700\u8981\u4f7f\u7528\u4e00\u53e5\u5916\u90e8\u58f0\u660e\u5c31\u53ef\u4ee5\u5f15\u7528\u5230\u8be5\u5bf9\u8c61\uff1a
extern C\u00d7\u00d7\u00d7App theApp;
\u4ee5\u540e\u76f4\u63a5\u4f7f\u7528\u6539theApp\u552f\u4e00\u7684\u5e94\u7528\u7a0b\u5e8f\u7c7b\u5bf9\u8c61\u6765\u5f15\u7528ADO\u8fde\u63a5\u6570\u636e\u5e93\u6307\u9488\u3002\u800c\u4e14\u5728\u91ca\u653e\u6539\u5bf9\u8c61\u7684\u65f6\u5019\u53ea\u9700\u8981\u5728\u5e94\u7528\u7a0b\u5e8f\u7c7bC\u00d7\u00d7\u00d7App\u7684\u8986\u5199\u865a\u51fd\u6570ExitInstance()\u4e2d\u91ca\u653e\u8be5\u8d44\u6e90\u5c31\u53ef\uff0c\u5f88\u65b9\u4fbf\u7ba1\u7406\u7684\u3002

\u53ef\u4ee5\u6bd4\u5982\u5728 app\u5934\u6587\u4ef6\u91cc\u9762 extern int g_nbianliang; \u7136\u540e\u5728\u4e24\u4e2a\u6587\u4ef6\u90fd\u5305\u542b\u8fd9\u4e2a\u6587\u4ef6 \u5bf9\u5176\u8fdb\u884c\u64cd\u4f5c

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

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

下面是我写的一个数据库类你看下吧! 头文件**********************************************************************#ifndef DATABASE_CLASS_H
#define DATABASE_CLASS_H//引用COM组件DLL
#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF", "adoEOF")class DataBase
{
public:
//自定义设置连接字符串,可随意选择连接类型
DataBase(std::string strConn = "");
~DataBase();
//连接Access数据库,传递数据库路径,或无参,通过构造函数设置连接字符串连接数据库
int Open(std::string strAccessPath = "");
//设置Sql server数据库信息,并连接
int Open(std::string strHost, std::string strDatabase, std::string strUsername, std::string strPassword);
//判断指向数据是否存在
bool Empty(void);
//传递列名,获取该行该列数据
_variant_t operator[](const std::string &strIndex);
//移动指向数据
void Move(int i);
//转换为std::string数据类型
const std::string toStr(const _variant_t &var);

//设置数据命令
friend DataBase& operator<<(DataBase& data, std::string strCmd);
//执行命令,index为影响行数
friend DataBase& operator>>(DataBase& data, int &index);public:
typedef _RecordsetPtr DataSet;
//数据移动
enum MoveType{First = 0, Next = 1, Last = 2};private:
std::string commString; //数据库命令
std::string connString; //数据库连接字符串
_ConnectionPtr connPtr; //数据库连接对象
DataSet dataSet; //数据集合
};#endif 源文件**************************************************************************#include <windows.h>
#include <iostream>
#include <string>
#include "DataBase.h"DataBase::DataBase(std::string strConn):connString(strConn)
{
CoInitialize(NULL); //初始化COM库 connPtr.CreateInstance(__uuidof(Connection));
dataSet.CreateInstance(__uuidof(Recordset));
}DataBase::~DataBase()
{
//如果该对象被打开我就关闭它
if (connPtr->State == adStateOpen)
{
connPtr->Close();
}
if (dataSet->State == adStateOpen)
{
dataSet->Close();
}
//在构造函数中创建了该对象,因此要销毁它
connPtr.Release();
dataSet.Release();
//卸载COM库
CoUninitialize();
}int DataBase::Open(std::string strAccessPath)
{
if (!strAccessPath.empty())
connString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + strAccessPath;
try
{
//设置数据库连接字符串并连接
connPtr->ConnectionString = connString.c_str();
connPtr->Open("", "", "", -1);
}
catch(_com_error e)
{
return -1;
}
return 0;
}int DataBase::Open(std::string strHost, std::string strDatabase, std::string strUsername, std::string strPassword)
{
try
{
//设置连接字符串并连接
connString = "Driver={SQL Server};Server=" + strHost + ";Database=" + strDatabase + ";Uid=" + strUsername + ";Pwd=" + strPassword + ";";
connPtr->ConnectionString = connString.c_str();
connPtr->Open("", "", "", -1);
}
catch(_com_error e)
{
std::cout << e.Description();
return -1;
}
return 0;
}DataBase& operator<<(DataBase& data, std::string strCmd)
{
//设置SQL语句
data.commString = strCmd; return data;
}DataBase& operator>>(DataBase& data,int &index)
{
try
{
//执行SQL语句
data.dataSet = data.connPtr->Execute(data.commString.c_str(), NULL, -1);
index = data.dataSet;
}
catch(_com_error e)
{
index = -1;
} return data;
}bool DataBase::Empty(void)
{
if (connPtr->State != adStateOpen)
return false;
return dataSet->adoEOF;
}_variant_t DataBase::operator[](const std::string &strIndex)
{
_variant_t varData;
try
{
//获取当前指向行的该列数据
varData = dataSet->GetCollect(strIndex.c_str());
}
catch(_com_error e)
{
return NULL;
}
return varData;
}void DataBase::Move(int index)
{
switch(index)
{
case DataBase::First:
dataSet->MoveFirst(); //移动到一开始
break;
case DataBase::Next:
dataSet->MoveNext(); //移动到下一行
break;
case DataBase::Last:
dataSet->MoveLast(); //移动到最后的下一个
break;
}
}const std::string DataBase::toStr(const _variant_t &var)
{
const std::string str = (const char*)(_bstr_t)var;
return str;
}

你可以进MFC的
ClassVIew里 每个mfc工程都会有个theApp的全局变量
双击它 找到它的位置
然后把你要定义的全局变量跟他写在一起
然后在这个文件的.h文件中用extern声明该变量就可以了

  • 鍦∕FC涓浣曞畾涔夊叏灞鍙橀噺,濡備綍寮曠敤瀹?
    绛旓細鐢MFC鐢熸垚鐨勫伐绋嬩腑閮芥湁涓涓悕涓篊xxxApp鐨勭被锛屽畠娲剧敓浜嶤WinApp绫汇傝繖涓被涓昏杩涜绋嬪簭鐨勫垵濮嬪寲锛岀敓鎴愭枃妗c佽鍥惧璞$瓑宸ヤ綔銆傛垜浠彲浠ユ妸闇瑕鍏ㄥ眬璁块棶鐨鍙橀噺鍜屽嚱鏁瀹氫箟涓鸿繖涓被鐨勬垚鍛樺彉閲忓拰鎴愬憳鍑芥暟锛屽氨鍙互瀹炵幇鍏ㄥ眬璁块棶浜嗐備粠涓ユ牸鎰忎箟涓婅锛岃繖绉嶅彉閲忓拰鍑芥暟骞朵笉鏄叏灞鐨勶紝鍥犱负瀹冧粛鐒跺彧鏄被涓殑鎴愬憳锛屽彧鏄敱浜庢垜...
  • mfc鎬庝箞璁剧疆鍏ㄥ眬鍙橀噺
    绛旓細MFC妗嗘灦涓嬶紝璁剧疆鍏ㄥ眬鍙橀噺鏈夊嚑绉嶆柟娉曪紝鍏朵腑锛绗竴绉嶆槸鎺ㄨ崘鐢ㄦ硶锛氫綔涓篈PP绫荤殑鎴愬憳鍑芥暟銆侫PP绫绘槸鍏ㄥ眬鍞竴鐨勶紝瀹冪殑鎴愬憳鍑芥暟涔熷叿鏈夊叏灞鎬у拰浠绘剰浣嶇疆鍙闂殑鎬ц川銆傝闂柟娉曪細((CYourApp *)AfxGetApp())->浣犵殑鏁扮粍 浣滀负mainframe绫绘垚鍛樺嚱鏁帮紙鎴栬呬富瀵硅瘽妗嗙被鎴愬憳鍑芥暟锛夛紝杩欎釜涔熷叿鏈夊叏灞鍞竴鎬э紝鍙互閫氳繃AfxGetMain...
  • 鎬庝箞璁剧疆MFC鐨鍏ㄥ眬鍙橀噺? 姹傛竻鏅版楠
    绛旓細1銆傚湪涓绫荤殑.cpp涓瀹氫箟 int myInt;鐒跺悗鍐嶅湪瑕佺敤鍒扮殑鍦版柟鐨.cpp閲宔xtern int myInt锛涜繖鏍峰氨鍙互鐢ㄤ簡銆2銆傚湪stdafx.cpp涓姞鍏:int myInt;鐒跺悗鍦╯tdafx.h涓姞鍏:extern int myInt 杩欐牱瀹氫箟浠ュ悗鏃犺鍦ㄤ粈涔堟枃浠朵腑閮芥槸鍙鐨.姣旇緝瑙勮寖鐨勬槸锛屽厛瀹氫箟涓涓狦lbs.h锛屾妸鎵鏈夌殑鍏ㄥ眬鍙橀噺鍘熷瀹氫箟鏀捐繘鍘汇傜劧鍚庡畾涔...
  • 鍦∕FC涓浣曞畾涔夊叏灞鍙橀噺,濡備綍寮曠敤瀹?
    绛旓細璇DO杩炴帴鍙橀噺瀹氫箟鍦ㄥ摢涓ご鏂囦欢涓紵杩欎釜澶存枃浠舵槸鍚﹀寘鍚繘鏉ヤ簡锛堟槸璇村湪褰撳墠浣跨敤璇ュ璞$殑鏂囦欢涓級锛熷缓璁細鏈濂戒笉瑕佸畾涔夋垚鍏ㄥ眬鍙橀噺锛灏嗗畠瀹氫箟涓篈PP绫荤殑鏁版嵁鎴愬憳灏卞彲浠ヤ簡锛屼互鍚庡啀浠绘剰鏂囦欢涓彧闇瑕佷娇鐢ㄤ竴鍙ュ閮ㄥ0鏄庡氨鍙互寮曠敤鍒拌瀵硅薄锛歟xtern C脳脳脳App theApp;浠ュ悗鐩存帴浣跨敤鏀箃heApp鍞竴鐨勫簲鐢ㄧ▼搴忕被瀵硅薄鏉ュ紩...
  • mfc涓璁剧疆鍏ㄥ眬鍙橀噺鐨勮瘽搴旇鏀惧摢閲?姣斿鎴戣璁剧疆涓涓猻tring v,鍦ㄦ暣涓猰f...
    绛旓細杩欎釜鍙互鏀惧湪澶存枃浠舵墍鏈夊嚱鏁板0鏄庣殑澶栭潰锛岃鎯冲湪鏁翠釜MFC绋嬪簭涓兘鑳借闂紝灏辫鍦ㄥ叾涓殑鎵鏈夊ご鏂囦欢涓仛涓0鏄庯紝姣斿璇磗tring v;閭d箞鍦ㄥ叾瀹冨ご鏂囦欢涓氨瑕佸仛澹版槑:extern string v;
  • mfc缂栫▼涓畾涔涓涓叏灞绫,鍏ㄥ眬瀵硅薄,闈欐佹垚鍛鍙橀噺
    绛旓細鍝庯紝鎵嶄簲鍒嗭紝濂戒箙娌℃潵浜嗭紝灏卞洖绛斾竴涓嬨傚鏋滀綘鎯冲畾涔夌殑鏄鍏ㄥ眬鍙橀噺锛閭d箞瀹氫箟涓涓枃浠秅lobal.h鍜宔xtern.h 鍦╣lobal.h涓畾涔鍙橀噺锛屽湪extern.h涓繘琛宔xtern澹版槑 鍦╯tdafx.h涓寘鍚玡xtern.h 鍦╩ainframe.h涓寘鍚玤lobal.h 鍦╩ainframe.cpp涓繘琛屽彉閲忕殑鍒濆鍖栵紝濡傛灉杩藉姞鍒50鍒嗘垜鍙互缁欎綘鍋氫竴涓ā鏉 ...
  • MFC瀵硅瘽妗嗙被涓,鎬庝箞鏍峰畾涔夊叏灞鍙橀噺?
    绛旓細涓銆佽缃緭鍏ュ璇濇鐨凟ditBox鍙橀噺涓"m_w"锛岃缃璇濇绫诲悕涓"CW".浜屻佷负杈撳叆鎸夐挳娣诲姞娑堟伅鍝嶅簲浠g爜锛歷oid CW::OnButton1(){ // TODO: Add your control notification handler code here UpdateData(TRUE);} 涓夈佽缃緭鍑哄璇濇(CP绫)鐨凟ditBox鍙橀噺涓"m_p".鍥涖佷负杈撳嚭鎸夐挳娣诲姞娑堟伅鍝嶅簲浠g爜OnButton...
  • MFC瀹氫箟鍏ㄥ眬鍙橀噺闂!
    绛旓細LZ涓瀹氭槸鍦ㄥご鏂囦欢閲岄潰瀹氫箟鐨勫彉閲忓惂 鍏ㄥ眬鍙橀噺鐨勫0鏄庡鏋滄槸鍦ㄥご鏂囦欢閲屽ご锛岃杩欎箞鍐 extern int a; //澹版槑 鐒跺悗鍦ㄤ竴涓猚pp鏂囦欢閲屽ご鍏ㄥ眬鐨勪綅缃啀鍐欎笂 int a; //杩欎釜鎵嶆槸瀹炰緥锛屽彧鑳藉湪涓涓猚pp閲岄潰鍑虹幇 杩欐牱灏卞彲浠ュ啀寮曠敤璇ュご鏂囦欢鐨勫湴鏂逛娇鐢ㄨ繖涓彉閲忋
  • MFC鎺ュ彈瀛楃鏁版嵁鏃,鍏ㄥ眬鍙橀噺鎬庝箞瀹氫箟
    绛旓細鍏ㄥ眬鍙橀噺鏄湪鍑芥暟鍜岀被涔嬪瀹氫箟鐨勫彉閲忋
  • mfc鍏ㄥ眬鍙橀噺闂
    绛旓細鍦–PP涓瀹氫箟 CDC PictureDC,鍦ㄥご鏂囦欢涓0鏄巈xtern CDC PictrueDC,鐒跺悗鍦ㄥ叾浠栫被涓璱nclude璇ュご鏂囦欢鍗冲彲
  • 扩展阅读:if判断多个条件怎么写 ... 全局变量放在哪里 ... c#在哪里定义全局变量 ... 定义全局变量时最大值 ... c++中全局变量怎么声明 ... c语言全局变量声明 ... mf47型万用表组成步骤 ... c全局变量被改值了 ... c怎么在main定义全局变量 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网