首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

《MFC深入浅出》中一个关于STATIC成员变量的有关问题!

2012-02-21 
《MFC深入浅出》中一个关于STATIC成员变量的问题!!谢谢各位,我把《MFC深入浅出》(PAGE103,Frame3范例程序贴在

《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是另一个类的静态实例对象,
这里牵扯到全局静态变量和静态类变量的初始化顺序问题。
你试试颠倒这几句的次序看看,应该结果会不一样.

热点排行