|
100鱼币
本帖最后由 F3IYcZ7 于 2017-3-13 15:53 编辑
这段代码原先是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 个参数的函数;
因为之前没有看到互助平台有悬赏鱼币的选项,所以重复发了这个帖子,麻烦版主删除前面无悬赏帖子
http://bbs.fishc.com/forum.php?m ... p;extra=#pid2829879
问题已经解决
- #pragma once
- #include <vector>
- #include <windows.h>
- #include <iostream>
- typedef std::vector<std::wstring> Command;
- using namespace std;
- class CCmdHandlers1
- {
- public:
- CCmdHandlers1();
- ~CCmdHandlers1();
- //命令接收处理函数
- BOOL DispatchCommand(const Command& cmd);
- void CCmdHandlers1::OnStartDebug(const Command & cmd);
- void CCmdHandlers1::OnGo(const Command & cmd);
- void CCmdHandlers1::OnDump(const Command & cmd);
- private:
- Command cmd;
- };
- BOOL CCmdHandlers1::DispatchCommand(const Command & cmd)
- {
- static struct {
- LPCTSTR cmd;
- void(CCmdHandlers1::* handler)(const Command&);
- } cmdMap[] = {
- { TEXT("s"),&CCmdHandlers1::OnStartDebug },
- { TEXT("g"),&CCmdHandlers1::OnGo },
- { TEXT("d"),&CCmdHandlers1::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) {
- (this->*cmdMap[index].handler)(cmd);
- //cmdMap[index].handler(cmd);
- return TRUE;
- }
- }
- wcout << TEXT("Invalid command.") << endl;
- return TRUE;
- }
- void CCmdHandlers1::OnStartDebug(const Command & cmd)
- {
- MessageBoxA(NULL, "OnStartDebug", "OnStartDebug", NULL);
- }
- void CCmdHandlers1::OnGo(const Command & cmd)
- {
- MessageBox(NULL, L"OnGo", L"OnGo", NULL);
- }
- void CCmdHandlers1::OnDump(const Command & cmd)
- {
- MessageBox(NULL, L"OnDump", L"OnDump", NULL);
- }
复制代码
C++使用结构体 函数指针赋值的时候涉及到类指针,问题已经解决。
将//cmdMap[index].handler(cmd); 修改为(this->*cmdMap[index].handler)(cmd); 就可以了,指向自身的指针。
|
最佳答案
查看完整内容
问题已经解决
C++使用结构体 函数指针赋值的时候涉及到类指针,问题已经解决。
将//cmdMap.handler(cmd); 修改为(this->*cmdMap.handler)(cmd); 就可以了,指向自身的指针。
|