#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)..它们是否从派生类构造函数传递接收到的值,然后将其分配给基类构造函数。 .if所以newMsg将在调用基类构造函数时被定义为未定义... 如果采用相反的情况,则ID将保持未定义...
无法理解语句的执行,
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;
}
答案 0 :(得分:2)
static const GetEvent cGetEvent;
GetEvent::GetEvent():ClassA( ID, newMsg, NULL, NULL, 0 )
{
//no stmts inside;
}
此语法称为initialization list,可用于在构造期间初始化类成员。构造派生类对象时,其父类也将初始化(从层次结构的顶部开始)。在这种情况下,GetEvent
构造函数指定如何构造ClassA
对象(尽管读取代码时,classA
的实际类定义未指定此构造函数)。
typedef ClassA* (*pNewMsg)(void);
此函数指针typedef表示...
我们可以调用pNewMesg
的函数指针,它不带参数(void
)并返回指向ClassA
对象的指针。
在C ++常见问题解答中更好地解释函数指针typedef语法:http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5