还是成员函数指针的问题

doudoushen 2009-10-19 10:29:46
这次是非静态的类成员函数


#include <vector>
using namespace std;



typedef void (CALLBACK *MSGCALLBACK)(DWORD dwMsgID, WPARAM wParam, LPARAM lParam );


class core
{
public:
void RegMsgDeal(DWORD dwMsgID, MSGCALLBACK pCB)
{
}

void Dispatch(DWORD dwMsg, WPARAM wParam, LPARAM lParam)
{
}
};

class A
{
public:
void __stdcall Test( DWORD dwMsg, WPARAM wParam, LPARAM lParam );
};


#define WM_MSG WM_USER+1000
core g_mycore;
A g_a;
void CZafDlg::OnButton1()
{
DWORD dwMsg = WM_MSG;
g_mycore.RegMsgDeal( dwMsg, g_a.Test );

}

//编译不过
cannot convert parameter 2 from 'void (unsigned long,unsigned int,long)' to 'void (__stdcall *)(unsigned long,unsigned int,long)'

...全文
129 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
herman~~ 2009-10-20
  • 打赏
  • 举报
回复
指向类的成员

应该加上A::。。。
butwang 2009-10-20
  • 打赏
  • 举报
回复
对,必须要有一个类的实例来调用,c++的成员函数是__thiscall
pcboyxhy 2009-10-20
  • 打赏
  • 举报
回复
C++ Primer 第四版 18.3
TCPL 第三版 15.5

看看指向成员函数的指针应该怎么定义,怎么调用
yunccll 2009-10-20
  • 打赏
  • 举报
回复
void core::Dispatch(DWORD dwMsg, WPARAM wParam, LPARAM lParam)
{
((tInfo)m_vct[0]).pCB( dwMsg, wParam, lParam );//这里出错
}

m_vct[0].pCB 是一个 member function pointer; 例如: A::Test;

A::Test调用的方式是:A a ; a.Test(..);

m_vct[0].pCB 就相当于是 A:Test,所以调用时,也需要 A 的instance!
doudoushen 2009-10-19
  • 打赏
  • 举报
回复
回pcboyxhy ,你的方法可以编译通过,现在问题是怎么Dispatch 代码稍微改了下


class A 
{
public:
void Test( DWORD dwMsg, WPARAM wParam, LPARAM lParam );
};
typedef void (A::*MSGCALLBACK)(DWORD dwMsgID, WPARAM wParam, LPARAM lParam );

typedef struct tagInfo
{
DWORD MsgID;
MSGCALLBACK pCB;
}tInfo;

class core
{
public:
void RegMsgDeal(DWORD dwMsgID, MSGCALLBACK pCB);
void Dispatch(DWORD dwMsg, WPARAM wParam, LPARAM lParam);

vector<tInfo>m_vct;
};


void core::RegMsgDeal(DWORD dwMsgID, MSGCALLBACK pCB)
{
tInfo tTmp;
tTmp.MsgID = dwMsgID;
tTmp.pCB = pCB;
m_vct.push_back(tTmp);
}

void core::Dispatch(DWORD dwMsg, WPARAM wParam, LPARAM lParam)
{
((tInfo)m_vct[0]).pCB( dwMsg, wParam, lParam );//这里出错
}

void A::Test( DWORD dwMsg, WPARAM wParam, LPARAM lParam )
{
TRACE("dwMsg = %d, wParam = %d, lParam = %d\n", dwMsg, wParam, lParam);
}
pcboyxhy 2009-10-19
  • 打赏
  • 举报
回复
class A 
{
public:
void Test( int dwMsg, int wParam, int lParam ){};
};
typedef void (A::*MSGCALLBACK)(int dwMsgID, int wParam, int lParam );


class core
{
public:
void RegMsgDeal(int dwMsgID, MSGCALLBACK pCB)
{
}
void Dispatch(int dwMsg, int wParam, int lParam)
{
}
};

core g_mycore;
A g_a;
int main()
{
int dwMsg = 1000;
g_mycore.RegMsgDeal( dwMsg, &A::Test );
}


指向成员函数的指针,声明时指定类名试试看
doudoushen 2009-10-19
  • 打赏
  • 举报
回复
去了也报void (unsigned long,unsigned int,long)' to 'void (__cdecl *)(unsigned long,unsigned int,long)
pcboyxhy 2009-10-19
  • 打赏
  • 举报
回复
把CALLBACK去掉么
doudoushen 2009-10-19
  • 打赏
  • 举报
回复
楼上2位 你们说的都对 我也感觉是这样,但是这样的问题怎么改呢。
whg01 2009-10-19
  • 打赏
  • 举报
回复
有__stdcall和没有__stdcall的函数是有差别的。
eatsweetpotato 2009-10-19
  • 打赏
  • 举报
回复
成员函数指针不能这样赋值吧

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧