请教类函数指针问题。
先上马
.h文件:
typedefvoid (CControlBase::*ControlMouseEventCB)(CControlBase * pControlBase, int nMouseX, int nMouseY);
class CControlBase
{
public:
static enum MOUSE_EVENT_TYPE
{
MOUSE_EVENT_L_UP,
MOUSE_EVENT_L_DOWN,
MOUSE_EVENT_R_UP,
MOUSE_EVENT_R_DOWN,
MOUSE_EVENT_MOVE,
MOUSE_EVENT_MAX,
};
public:
CControlBase(CONTROL_TYPE eControlType);
virtual~CControlBase();
voidSetMouseEventCB(MOUSE_EVENT_TYPE eMouseEventType, ControlMouseEventCB pEventFuncCB);
voidActiveMouseEvent(MOUSE_EVENT_TYPE eMouseEventType, int nMouseX, int nMouseY);
virtual boolOnMouseLDown(int nMouseX, int nMouseY);
virtual boolOnMouseLUp(int nMouseX, int nMouseY);
virtual boolOnMouseRDown(int nMouseX, int nMouseY);
virtual boolOnMouseRUp(int nMouseX, int nMouseY);
virtual boolOnMouseMove(int nMouseX, int nMouseY);
protected:
CControlBase(const CControlBase & val);
CControlBase & operator=(const CControlBase & rhs);
protected:
MOUSE_EVENT_TYPEm_eMouseCurType;
ControlMouseEventCBm_pMouseEventFuncCB[MOUSE_EVENT_MAX];
};
void CControlBase::SetMouseEventCB(MOUSE_EVENT_TYPE eMouseEventType, ControlMouseEventCB pEventFuncCB)
{
if(eMouseEventType < 0 || eMouseEventType >= MOUSE_EVENT_MAX)
return;
m_pMouseEventFuncCB[eMouseEventType] = pEventFuncCB;
}
void CControlBase::ActiveMouseEvent(MOUSE_EVENT_TYPE eMouseEventType, int nMouseX, int nMouseY)
{
if(eMouseEventType < 0 || eMouseEventType >= MOUSE_EVENT_MAX)
return;
if(m_pMouseEventFuncCB[eMouseEventType])
(*m_pMouseEventFuncCB[eMouseEventType])(this, nMouseX, nMouseY);
}
or
( ptr->*coord )();
These are converted internally by the compiler to, respectively,
// Pseudo C++ Code
( coord )( & origin );
and
// Pseudo C++ Code
( coord )( ptr );
The pointer-to-member function declaration syntax and pointer-to-member selection operators serves literally as placeholders for the this pointer. (This is why static member functions, which are without a this pointer, are of type "pointer to function," not "pointer-to-member function.")
Use of a pointer to member would be no more expensive than a nonmember pointer to function if it weren't for virtual functions and multiple inheritance (including, of course, virtual base classes), which complicate both the type and invocation of a pointer to member. In practice, for those classes without virtual functions or virtual or multiple base classes, the compiler can provide equivalent performance. In the next section, I look at how support for virtual functions complicates support for pointer-to-member functions.