在CPP文件中可以直接定义对象实例吗?解决办法
在CPP文件中可以直接定义对象实例吗?
在VC中新建了一个MFC项目,项目名称为MyAppApp
在该项目的MyApp.cpp文件中,有句话,我有些不理解,下面红色标识的语句,麻烦大家帮忙解释一下,谢谢大家!
#include "stdafx.h"
#include "MyApp.h"
#include "MyAppDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyAppApp
BEGIN_MESSAGE_MAP(CMyAppApp, CWinApp)
//{{AFX_MSG_MAP(CMyAppApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyAppApp construction
CMyAppApp::CMyAppApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CMyAppApp object
CMyAppApp theApp; 这句话好奇怪,它不属于类吧,这句话的作用是什么,类中不能直接定义对象实例吧?
/////////////////////////////////////////////////////////////////////////////
// CMyAppApp initialization
BOOL CMyAppApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CMyAppDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
------解决思路----------------------
MFC的奥秘竟然被你找到了,可喜可贺,难道你没发现,整个MFC文档视图框架,Wizard为你定义了APP类,View类。DOC类等,却没有一个对象,应用程序是如何被启动的,今天,你终于找到了,恭喜。
------解决思路----------------------
CMyAppApp theApp;
这不就是全局变量吗?
theApp在MFC框架中是一个知识点。用框架生成的MFC程序,都有这个变量。
------解决思路----------------------
全局变量
要看清楚哦,它并没有在类里面
------解决思路----------------------
我们常说的“应用程序唯一的实例”,实际上就是通过全局变量来实现的,这个实例对象作为全局变量,在应用程序启动函数入口_tWinMain调用之前进行构造,并在_tWinMain中会获取这个对象指针,然后通过这个指针调用它的InitInstance函数进行应用程序的初始化
你可以在InitInstance函数中打个断点,调试的时候查看堆栈,基本上对于应用程序的启动流程就有个直观的了解了
------解决思路----------------------
楼上几位都是正解
------解决思路----------------------
“CMyAppApp theApp; 这句话好奇怪,它不属于类吧,这句话的作用是什么,类中不能直接定义对象实例吧?”
当 需要 时 可以
extern CMyAppApp theApp;
------解决思路----------------------
CMyAppApp theApp; 这句话好奇怪,它不属于类吧,这句话的作用是什么,类中不能直接定义对象实例吧
--------------------------------------------------------------------------------------
你表述的“类中”是啥意思?
这句定义语句写在一个cpp文件当中,是作为全局变量来用的啊。再者,类中为什么不能定义对象实例呢?
------解决思路----------------------
+1
------解决思路----------------------
任何应用程序的入口当然是main函数啊(当然Win32 应用程序的入口是类似于main函数的WinMain,在调用WinWain之前还有一系列的函数,比如说mainCRTStartup之类啥的,前面不是跟你说了嘛,你打个断点,执行到断点的地方,查看堆栈的调用情况就一目了然了,不要再那儿瞎猜,自己跟进去看看它的调用顺序才是王道)。
我的意思是,既然整个项目是一个类,那就应该没有定义这个类的实例的地方呀?
----------------------------------------------------------------------------------------------------------------
对于这个问题,我实在不知道该如何回答。请问你C++学多久了?
------解决思路----------------------
"既然整个项目是一个类"
类是什么, 是一个 数据结构 (类似structure), 整个项目 是个 实例。
------解决思路----------------------
程序的入口是main()(MFC入口是WinMain),但是运行main之前会先分配全局变量的空间
建议看看 MFC AppWizard的原理与MFC程序框架的剖析
------解决思路----------------------
就是一个全局变量而已!
------解决思路----------------------
cpp中定义一个类的对象没有问题,红字的地方就是定义了一个全局的类对象。
------解决思路----------------------
CMyAppApp theApp; 全局变量,也就是项目启动的时候需要自己实例化,不然app启动不起来,主要还是涉及到WinMain函数
------解决思路----------------------
extern CMyAppApp theApp 作用:类中可以直接定义对象实例,当一个类实例化时,这个类中定义的其它类也同时被实例化,表示共用同一个theApp,如果写成 CMyAppApp theApp 表示新建一个CMyAppApp 实例
在VC中新建了一个MFC项目,项目名称为MyAppApp
在该项目的MyApp.cpp文件中,有句话,我有些不理解,下面红色标识的语句,麻烦大家帮忙解释一下,谢谢大家!
#include "stdafx.h"
#include "MyApp.h"
#include "MyAppDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyAppApp
BEGIN_MESSAGE_MAP(CMyAppApp, CWinApp)
//{{AFX_MSG_MAP(CMyAppApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyAppApp construction
CMyAppApp::CMyAppApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CMyAppApp object
CMyAppApp theApp; 这句话好奇怪,它不属于类吧,这句话的作用是什么,类中不能直接定义对象实例吧?
/////////////////////////////////////////////////////////////////////////////
// CMyAppApp initialization
BOOL CMyAppApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CMyAppDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
------解决思路----------------------
MFC的奥秘竟然被你找到了,可喜可贺,难道你没发现,整个MFC文档视图框架,Wizard为你定义了APP类,View类。DOC类等,却没有一个对象,应用程序是如何被启动的,今天,你终于找到了,恭喜。
------解决思路----------------------
CMyAppApp theApp;
这不就是全局变量吗?
theApp在MFC框架中是一个知识点。用框架生成的MFC程序,都有这个变量。
------解决思路----------------------
全局变量
要看清楚哦,它并没有在类里面
------解决思路----------------------
我们常说的“应用程序唯一的实例”,实际上就是通过全局变量来实现的,这个实例对象作为全局变量,在应用程序启动函数入口_tWinMain调用之前进行构造,并在_tWinMain中会获取这个对象指针,然后通过这个指针调用它的InitInstance函数进行应用程序的初始化
你可以在InitInstance函数中打个断点,调试的时候查看堆栈,基本上对于应用程序的启动流程就有个直观的了解了
------解决思路----------------------
楼上几位都是正解
------解决思路----------------------
“CMyAppApp theApp; 这句话好奇怪,它不属于类吧,这句话的作用是什么,类中不能直接定义对象实例吧?”
当 需要 时 可以
extern CMyAppApp theApp;
------解决思路----------------------
CMyAppApp theApp; 这句话好奇怪,它不属于类吧,这句话的作用是什么,类中不能直接定义对象实例吧
--------------------------------------------------------------------------------------
你表述的“类中”是啥意思?
这句定义语句写在一个cpp文件当中,是作为全局变量来用的啊。再者,类中为什么不能定义对象实例呢?
class A
{
public:
A();
~A();
private:
int m_nData;
}
class B
{
public:
B();
~B();
private:
A m_ObjectA;
}
------解决思路----------------------
+1
------解决思路----------------------
任何应用程序的入口当然是main函数啊(当然Win32 应用程序的入口是类似于main函数的WinMain,在调用WinWain之前还有一系列的函数,比如说mainCRTStartup之类啥的,前面不是跟你说了嘛,你打个断点,执行到断点的地方,查看堆栈的调用情况就一目了然了,不要再那儿瞎猜,自己跟进去看看它的调用顺序才是王道)。
我的意思是,既然整个项目是一个类,那就应该没有定义这个类的实例的地方呀?
----------------------------------------------------------------------------------------------------------------
对于这个问题,我实在不知道该如何回答。请问你C++学多久了?
------解决思路----------------------
"既然整个项目是一个类"
类是什么, 是一个 数据结构 (类似structure), 整个项目 是个 实例。
------解决思路----------------------
全局变量
要看清楚哦,它并没有在类里面
那这个程序运行时,运行的第一句源程序是哪句?
程序的入口是main()(MFC入口是WinMain),但是运行main之前会先分配全局变量的空间
建议看看 MFC AppWizard的原理与MFC程序框架的剖析
------解决思路----------------------
就是一个全局变量而已!
------解决思路----------------------
cpp中定义一个类的对象没有问题,红字的地方就是定义了一个全局的类对象。
------解决思路----------------------
CMyAppApp theApp; 全局变量,也就是项目启动的时候需要自己实例化,不然app启动不起来,主要还是涉及到WinMain函数
------解决思路----------------------
extern CMyAppApp theApp 作用:类中可以直接定义对象实例,当一个类实例化时,这个类中定义的其它类也同时被实例化,表示共用同一个theApp,如果写成 CMyAppApp theApp 表示新建一个CMyAppApp 实例