64,652
社区成员
发帖
与我相关
我的任务
分享
class CGameWindow
{
public:
typedef int (*RenderFun)(void);
void MessageLoop(RenderFun fun);
};
void CGameWindow::MessageLoop(RenderFun fun)
{
fun();
}
class CLobbyClient
{
public:
virtual int Render(void);
};
int CLobbyClient::Render(void)
{
return 1;
}
int (CLobbyClient::*PtrFunc)(void) = &CLobbyClient::Render;
void main()
{
CGameWindow* wnd = new CGameWindow();
CLobbyClient* lobby = new CLobbyClient();
wnd->MessageLoop(lobby->*PtrFunc); // 出错
}
//第一种方法是用0看作一个指针,但是对虚函数不起作用
//下面这种方法是用一个类搜索函数调用时需要的信息,在要的时候调用
//lobby->*PtrFunc这种函数对象必须马上进行()操作(见inside the c++ object model)
//而有的编译器支持这种闭包...
#include <iostream>
using namespace std;
class CLobbyClient;
class FUNCTION_CALL
{
typedef int (CLobbyClient::*RenderFun)(void);
CLobbyClient* it;
RenderFun fun;
public:
FUNCTION_CALL(CLobbyClient* _it, RenderFun _fun)
:it(_it), fun(_fun){}
void operator ()(){(it->*fun)();}
};
class CGameWindow
{
public:
void MessageLoop(FUNCTION_CALL fun);
};
void CGameWindow::MessageLoop(FUNCTION_CALL fun)
{
fun();
}
class CLobbyClient
{
public:
int Render(void);
};
int CLobbyClient::Render(void)
{
return 1;
}
int (CLobbyClient::*PtrFunc)(void) = &CLobbyClient::Render;
void main()
{
CGameWindow* wnd = new CGameWindow();
CLobbyClient* lobby = new CLobbyClient();
wnd->MessageLoop(FUNCTION_CALL(lobby, PtrFunc)); // 出错
}
//不是虚函数可以这样干,我等会儿再给一种方法
#include <iostream>
using namespace std;
class CLobbyClient;
class CGameWindow
{
public:
typedef int (CLobbyClient::*RenderFun)(void);
void MessageLoop(RenderFun fun);
};
void CGameWindow::MessageLoop(RenderFun fun)
{
((CLobbyClient*)0->*fun)();
}
class CLobbyClient
{
public:
int Render(void);
};
int CLobbyClient::Render(void)
{
return 1;
}
int (CLobbyClient::*PtrFunc)(void) = &CLobbyClient::Render;
void main()
{
CGameWindow* wnd = new CGameWindow();
CLobbyClient* lobby = new CLobbyClient();
wnd->MessageLoop(PtrFunc); // 出错
}