上一主题 下一主题 C++ 处理结构体函数指针的数组传参问题。
本帖最后由 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 == TEXT("q")) {
return FALSE;
}
for (int index = 0; cmdMap.cmd != NULL; ++index) {
if (cmd == cmdMap.cmd) {
cmdMap.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?mod=viewthread&tid=84112&page=1&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 == TEXT("q")) {
return FALSE;
}
for (int index = 0; cmdMap.cmd != NULL; ++index) {
if (cmd == cmdMap.cmd) {
(this->*cmdMap.handler)(cmd);
//cmdMap.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.handler(cmd); 修改为(this->*cmdMap.handler)(cmd); 就可以了,指向自身的指针。 C++使用结构体 函数指针赋值的时候涉及到类指针,问题已经解决。
将//cmdMap.handler(cmd); 修改为(this->*cmdMap.handler)(cmd); 就可以了,指向自身的指针。
页:
[1]