F3IYcZ7 发表于 2017-3-13 11:09:48

上一主题 下一主题 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

F3IYcZ7 发表于 2017-3-13 11:09:49

问题已经解决

#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); 就可以了,指向自身的指针。

F3IYcZ7 发表于 2017-3-13 15:51:18

C++使用结构体 函数指针赋值的时候涉及到类指针,问题已经解决。
将//cmdMap.handler(cmd); 修改为(this->*cmdMap.handler)(cmd); 就可以了,指向自身的指针。
页: [1]
查看完整版本: 上一主题 下一主题 C++ 处理结构体函数指针的数组传参问题。