C++ 处理结构体函数指针的数组传参问题。

17bdw学编程 2017-03-13 10:30:41
这段代码原先是C语言的代码,但是我想把它改成C++的代码。整段代码的作用是一个静态结构体内
定义了一个函数指针。根据我DispatchCommand(const Command & cmd)函数传进来的参数cmd,然后写成结构体数组的形式,根据s、g、d,进入相关的函数。

感觉这涉及到C++的指针指向问题,没能搞定。。


整段函数部分代码如下:

#include <vector>
typedef std::vector<std::wstring> Command;

class CCmdHandlers
{
public:
CCmdHandlers();
~CCmdHandlers();

//命令接收处理函数
BOOL DispatchCommand(const Command& cmd);

private:
Command cmd;
};


BOOL CCmdHandlers::DispatchCommand(const Command & cmd)
{

static struct {
LPCTSTR cmd;
void(CCmdHandlers::* handler)(const Command&);
} cmdMap[] = {

{ TEXT("s"),&CCmdHandlers::OnStartDebug },
{ TEXT("g"),&CCmdHandlers::OnGo },
{ TEXT("d"),&CCmdHandlers::OnDump },
{ NULL, NULL },

};

if (cmd.size() == 0) {
return TRUE;
}
else if (cmd[0] == TEXT("q")) {
return FALSE;
}

for (int index = 0; cmdMap[index].cmd != NULL; ++index) {

if (cmd[0] == cmdMap[index].cmd) {

cmdMap[index].handler(cmd);
return TRUE;
}
}

wcout << TEXT("Invalid command.") << endl;
return TRUE;
}


void CCmdHandlers::OnStartDebug(const Command & cmd)
{
MessageBoxA(NULL, "OnStartDebug", "OnStartDebug", NULL);
}


void CCmdHandlers::OnGo(const Command & cmd)
{
MessageBox(NULL, L"OnGo", L"OnGo", NULL);
}

void CCmdHandlers::OnDump(const Command & cmd)
{
MessageBox(NULL, L"OnDump", L"OnDump", NULL);
}




波浪线提示的错误如下:

VS编译器提示的错误:
1>d:\projectcode\\cmdhandlers.cpp(107): error C2064: 项不会计算为接受 1 个参数的函数;


...全文
577 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
17bdw学编程 2017-03-13
  • 打赏
  • 举报
回复
引用 1 楼 Janxionwang 的回复:
void CCmdHandlers::OnStartDebug(const Command & cmd) { MessageBoxA(NULL, "OnStartDebug", "OnStartDebug", NULL); } void CCmdHandlers::OnGo(const Command & cmd) { MessageBox(NULL, L"OnGo", L"OnGo", NULL); } void CCmdHandlers::OnDump(const Command & cmd) { MessageBox(NULL, L"OnDump", L"OnDump", NULL); } 你这几个函数没有声明啊
void OnStartDebug(const Command& cmd); void OnGo(const Command& cmd); void OnDump(const Command& cmd); 这三个函数是声明了的,楼主是把代码部分内容截取了出来。加上函数声明后编译器提示的问题才是是贴子中描述的问题。。
as86238582 2017-03-13
  • 打赏
  • 举报
回复
void OnStartDebug(const Command& cmd); void OnGo(const Command& cmd); void OnDump(const Command& cmd); 这三个函数我是声明了的,我把代码部分内容截取了出来。加上函数声明后,编译器提示的问题是我贴子中描述的问题。。
摩登码农 2017-03-13
  • 打赏
  • 举报
回复
void CCmdHandlers::OnStartDebug(const Command & cmd) { MessageBoxA(NULL, "OnStartDebug", "OnStartDebug", NULL); } void CCmdHandlers::OnGo(const Command & cmd) { MessageBox(NULL, L"OnGo", L"OnGo", NULL); } void CCmdHandlers::OnDump(const Command & cmd) { MessageBox(NULL, L"OnDump", L"OnDump", NULL); } 你这几个函数没有声明啊
roman_1987 2017-03-13
  • 打赏
  • 举报
回复
cmdMap[index].*handler(cmd); .*运算符
17bdw学编程 2017-03-13
  • 打赏
  • 举报
回复
问题已经解决。 C++使用结构体 函数指针赋值的时候涉及到类指针,问题已经解决。 将//cmdMap[index].handler(cmd); 修改为(this->*cmdMap[index].handler)(cmd); 就可以了,指向自身的指针。

64,649

社区成员

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

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