《MFC深入浅出》中一个关于STATIC成员变量的问题!!
谢谢各位,我把《MFC深入浅出》(PAGE103,Frame3范例程序贴在下边:
MFC.H文件如下:
#define BOOL int
#define TRUE 1
#define FALSE 0
#define LPCSTR LPSTR
typedef char* LPSTR;
#define UINT int
#define PASCAL _stdcall
#include <iostream.h>
class CObject;
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
CRuntimeClass* m_pBaseClass;
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
struct AFX_CLASSINIT
{ AFX_CLASSINIT(CRuntimeClass* pNewClass); };
#define RUNTIME_CLASS(class_name) \
(&class_name::class##class_name)
#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;
#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \
static char _lpsz##class_name[] = #class_name; \
CRuntimeClass class_name::class##class_name = { \
_lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name; } \
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
class CObject
{
public:
CObject::CObject() { }
CObject::~CObject() { }
virtual CRuntimeClass* GetRuntimeClass() const;
public:
static CRuntimeClass classCObject;
};
class CCmdTarget : public CObject
{
DECLARE_DYNAMIC(CCmdTarget)
public:
CCmdTarget::CCmdTarget() { }
CCmdTarget::~CCmdTarget() { }
};
class CWinThread : public CCmdTarget
{
DECLARE_DYNAMIC(CWinThread)
public:
CWinThread::CWinThread() { }
CWinThread::~CWinThread() { }
virtual BOOL InitInstance() { return TRUE; }
virtual int Run() { return 1; }
};
class CWnd;
class CWinApp : public CWinThread
{
DECLARE_DYNAMIC(CWinApp)
public:
CWinApp* m_pCurrentWinApp;
CWnd* m_pMainWnd;
public:
CWinApp::CWinApp() { m_pCurrentWinApp = this; }
CWinApp::~CWinApp() { }
virtual BOOL InitApplication() { return TRUE; }
virtual BOOL InitInstance() { return TRUE; }
virtual int Run() { return CWinThread::Run(); }
};
class CDocument : public CCmdTarget
{
DECLARE_DYNAMIC(CDocument)
public:
CDocument::CDocument() { }
CDocument::~CDocument() { }
};
class CWnd : public CCmdTarget
{
DECLARE_DYNAMIC(CWnd)
public:
CWnd::CWnd() { }
CWnd::~CWnd() { }
virtual BOOL Create();
BOOL CreateEx();
virtual BOOL PreCreateWindow();
};
class CFrameWnd : public CWnd
{
DECLARE_DYNAMIC(CFrameWnd)
public:
CFrameWnd::CFrameWnd() { }
CFrameWnd::~CFrameWnd() { }
BOOL Create();
virtual BOOL PreCreateWindow();
};
class CView : public CWnd
{
DECLARE_DYNAMIC(CView)
public:
CView::CView() { }
CView::~CView() { }
};
// global function
CWinApp* AfxGetApp();
[解决办法]
对MFC不熟,但第一个问题很好回答,
CRuntimeClass* CRuntimeClass::pFirstClass = NULL;
这一句一定会先处理,因为pFirstClass是个类中的static变量,static对象的初始化一定位于其他代码执行之前。所以这一句放在什么地方无所谓。
[解决办法]
class CRuntimeClass CObject::a;
static AFX_CLASSINIT _init_CObject(9);
class classA CRuntimeClass::m;
static AFX_CLASSINIT _init_CObject2(9);
=====================================================
第一个例子中,m是一个int类型。
而第二个例子中,a是一个静态实例对象, a中包含的m是另一个类的静态实例对象,
这里牵扯到全局静态变量和静态类变量的初始化顺序问题。
你试试颠倒这几句的次序看看,应该结果会不一样.