Недавно я вернулся к Visual C ++, программируя на C, где обратные вызовы намного проще.
У меня есть одноэлементный класс, который управляет 0 .. * подключенными устройствами.
Моя идея состоит в том, чтобы создать функцию в этом классе, которая будет перебирать множество
подключенных устройств и опубликуйте его с помощью обратного вызова для того, что может потребоваться.
, например
Singleton class
typedef void (CALLBACK * PortListCallback_t)(ptrConstCComPortInfo_t);
.
.
.
void CCommsMgr::listPorts(PortListCallback_t cb)
{
PortInfoSetConstIter_t i;
for (i = m_setPorts.begin(); i != m_setPorts.end(); i++)
{
cb(*i);
}
}
В первом случае потребителем является диалоговый класс MFC, который отлично работает, если его обратный вызов является статическим. Однако, чтобы получить доступ к данным / функциям члена диалогового класса, мне нужно передать «this» в синглтон-класс и отразить его обратно.
1010 *, например *
Singleton class
typedef void (CALLBACK * PortListCallback_t)(void *, ptrConstCComPortInfo_t);
.
.
.
void CCommsMgr::listPorts(void *pObj, PortListCallback_t cb)
{
PortInfoSetConstIter_t i;
for (i = m_setPorts.begin(); i != m_setPorts.end(); i++)
{
cb(pObj, *i);
}
}
Dialog Class
static void CALLBACK getPorts(void *obj, ptrConstCComPortInfo_t port);
.
.
.
void CALLBACK CMFC_iTFTPDlg::getPorts(void *obj, ptrConstCComPortInfo_t port)
{
CMFC_iTFTPDlg *pThis = (CMFC_iTFTPDlg*)obj;
// do something with it
}
Мой вопрос - есть ли лучший способ сделать это? Статические функции ощущаются как клудж, и я не хочу, чтобы класс Singleton был ограничен тем, как его можно использовать.
Если я уберу статику на getPorts, она не скомпилируется. Повторюсь, класс Singleton не должен знать своего потребителя.