如题!分不多!能解救本人的!50分相送!
解决方案 »
- 客户端调用COM作为进程内组件,是否需要链接代理/存根的dll?
- CMainFrame 中重载OnDestroy()的问题
- 非模态对话框不能添加控件(button,static...)
- 用VC++删除一个文件
- CMSHFlexGrid的行宽怎么设置后不起作用呀?
- 关于CryptoAPI加密的问题
- 请问:别人程序的一个对话框上有2个edit控件,我已找到这2个控件窗口的hwnd,但是设置文本却设置不上?
- 一个有关双缓冲绘图的问题,大神们看看有什么问题!!!
- 请问如何动态切换语言(60分)?
- *** 一个MDIGetActive()调用失败的问题……关键字:FromHandle,IsKindOf,GetActiveView
- 傻瓜问题
- 如何得到FTP服务器上某文件的属性
点一下就可以知道了,这里看到的就是这个工程中的全局变量和全局函数阿。
theApp是整个程序的入口,全局变量会在main()之前生成,theApp的生成会带动CObject,CCmdTarget.CWinThread,CWinApp的生成
Win98
想设一些全局变量。--- 随便在某个cpp文件中定义了一些变量,之后这些变量在ClasssView中显示为全局变量,但是实际上在其他.cpp中却不能用,为什么?真正的全局变量在哪里定义?能否在.h中定义全局变量? 回答: 你的定义方法没有什么问题,在其他类使用全局变量时,在变量的定义前加上extern,如:
extern int i;
当然,你可以把这样的定义放在一个头文件中。但不能把没有extern的定义放在头文件中。
实际上在类、函数之外声明的变量都是全局变量,所以如果在两个不同的.cpp中声明同名的变量,则在链接时肯定会报告错误。如果要避免这种潜在的冲突,可以在定义变量定义前加static,如:
static int nValue;
这样,在声明这个变量以外的.cpp中nValue不能访问,也不会引起冲突。 TangYunhai:
操作系统: Win98,NT
编程工具: VC++
问题: 1.基于MFC的SDI应用程序,如何申请一个全局CString变量?
How do I define a global CString variable,in SDI application of MFC?
2.如何在主框架生成之前,初始化这个变量?
How do I initialize this varibale,before the Main frame generated? 回答: 你可以在sdi.h中加入变量定义:
extern CString sGlobal;
然后在sdi.cpp中加入:
CString sGlobal;
初始化可以在CSdiApp::InitInstance中进行。
如果哪个模块需要调用全局变量,只需要加入
#include "sdi.h"
就可以了。
实际上在类、函数之外声明的变量都是全局变量,所以如果在两个不同的.cpp中声明同名的变量,则在链接时肯定会报告错误。如果要避免这种潜在的冲突,可以在定义变量定义前加static,如:
static int nValue;
这样,在声明这个变量以外的.cpp中nValue不能访问,也不会引起冲突。
http://www.china-askpro.com/msg21/qa60.shtml
////////////////////////////////////////////////////////////////////////用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不存在的问题。 总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。 本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( ProgramFan.Com )