Я наткнулся на следующий код при отладке. Мне удалось получить результат правильно, но я не понимал указатели функций, определенные здесь.
Здесь pNewMsgeFunc
- псевдоним указателя функции tNewMsg
, который создается внутри структуры stRsStruct
.
RsMsg.h
typedef RsMsg* (*tNewMsg)(void);
tNewMsg pNewMsgFunc;
typedef struct
{
int nMsgId;
NSString* sAsciiName;
tNewMsg pNewMsgFunc; // calls new for the particular message
} stRsStruct;
RsMsg.cpp
RsMsg(int uMessageId,tNewMsg pNewMsg,const char* szAsciiName,void* pData,
size_t uDataSize)
{
//intialisations
}
RsMsgDerived.h
#define DECLARE_NEWMSG(CssName,CssID) \
static CssName* FromMsg(RsMsg* pMsg) \
{ \
return dynamic_cast<CssName*>(pMsg); \
} \
static RsMsg* NewMsg() \
{ \
return new CssName; \
} \
enum {ID = CssID}; \
Говорят, что в структуре pNewMsgFunc будет указывать на функцию NewMsg ().
Но я не мог понять, как это возможно, без инициализации tNewMsg с адресом
функция NewMsg (). Но этот код работает нормально. Нет других конструкторов, используемых для
инициализировать указатель функции адресом функции NewMsg ().
Event.cpp
#import "RsMsg.h"
#import "RsMsgDerived.h"
RsMsg* RsMsg::CreateMessage(REMOTE_MESSAGE_ID nMessageNumber)
{
RsMsg* pMsg = NULL;
stRsStruct* pMsgStruct;
pMsg = pMsgStruct->pNewMsgFunc(); //Invoking the function pointer
}
Здесь, вызывая указатель на функцию, я вызываю статическую функцию NewMsg()
.
Но как эта функция вызывается как pNewMsgFunc()
, ей не присваивается адрес NewMsg
.
Мне нужно вызвать функцию NewMsg()
через pNewMsgFunc()
. Есть ли какие-либо изменения в вышеуказанном коде?
РЕДАКТИРОВАНИЕ:
Как реализовать тот же код в Objective C. Этот указатель на функцию вызывает функцию
тип возвращаемого значения - класс. Так что указатели на функции могут быть реализованы в C как
ее вызов функции, тип возвращаемого значения которой не может быть реализован в Objective C
как функция c.