2011-04-23 527 views
0
#define DECLARE_NEWMSG(ClassName,ClassID)     
static ClassName* FromMsg(ClassA* psg)    
{              
    return dynamic_cast<ClassName*>(psg);    
}              
static ClassA* newMsg()        
{              
    return new ClassName;        
}              
enum {ID = ClassID}; 

GET_EVENT = 0x41, 

typedef ClassA* (*pNewMsg)(void); //function pointer 

typedef struct 
{ 
    int   Id;  
    CString  Ascii;  
    pNewMsg MessageFunc; //calls new for the particular message 
} stStruct; 

ClassA 
{ 
//stmts; 
}; 

ClassA::ClassA(int Id,pNewMsg newMsg,const char* Ascii,void* Data,size_t DataSize) 
{ 
    initialises all the variables; 
} 

class GetEvent : public ClassA 
{ 
public: 
    DECLARE_NEWMSG(GetEvent,GET_EVENT); 
    GetEvent(); 
}; 


static const GetEvent cGetEvent; 
GetEvent::GetEvent():ClassA(ID, newMsg, NULL, NULL, 0) 
{ 
//no stmts inside; 
} 

無法理解GetEvent :: GetEvent():ClassA(ID,NewMsg,NULL,NULL,0)行。它們是否將派生值然後將其分配到基類的構造函數中。如果newMsg在調用基類構造函數時被定義爲未定義,那麼newMsg將保留爲未定義狀態。 如果採用相反的情況,則ID將保留爲未定義狀態。 。在C++中調用的基類和派生類構造函數

莫非不能夠理解語句的執行,

static const GetEvent cGetEvent; 
GetEvent::GetEvent():ClassA(ID, newMsg, NULL, NULL, 0) 
{ 
//no stmts inside; 
} 

並且還函數指針,

typedef ClassA* (*pNewMsg)(void); 

#define DECLARE_NEWMSG(ClassName,ClassID)     
static ClassName* FromMsg(ClassA* psg)    
{              
    return dynamic_cast<ClassName*>(psg);    
}              
static ClassA* newMsg()        
{              
    return new ClassName;        
} 

回答

2
static const GetEvent cGetEvent; 
GetEvent::GetEvent():ClassA(ID, newMsg, NULL, NULL, 0) 
{ 
//no stmts inside; 
} 

該語法被稱爲initialization list,並且可以用於施工期間初始化類成員。構建派生類對象時,其父類也將被初始化(從層次結構的頂部開始)。在這種情況下,GetEvent構造函數指定如何構造對象(儘管讀取代碼,classA的實際類定義未指定此構造函數)。

typedef ClassA* (*pNewMsg)(void); 

這個函數指針的typedef指...

一個函數指針,我們可以稱之爲pNewMesg它沒有參數(void),並返回一個指向ClassA對象。

在C++ FAQ中對函數指針typedef語法的稍微更好的解釋:http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5

相關問題