如何使一系列功能在C 中指示私有
How to make an array of function pointers private in C++?
我有一些直接的C风格代码,该代码实现了简单的命令解释器,如下所示:
typedef struct {
char *name;
int (*func)(char* args);
} sCOMMAND;
int func_reset(char* args);
int func_acc(char* args);
int func_dec(char* args);
const sCOMMAND CmdTbl[] = {
{ "RST", func_reset },
{ "ACC", func_acc },
{ "DEC", func_dec }
};
void ProcessCommand (char *cCmd)
{
int ndx = NUM_CMDS;
// shortest cmd is 3 chars
if (strlen(cCmd) >= MIN_CMD_LEN)
{
/////////////////////////////////////////////////////
// Chop the command line into substrings with ptr to
// each one where *parm[0] points to the command.
char *parms[MAX_PARMS];
ParseCommand(cCmd, parms);
/////////////////////////////////////////////////////
// Scan the command table looking for a match
for (int ndx = 0; ndx < NUM_CMDS; ndx++)
{
if (stricmp (CmdTbl[ndx].name, &parms[0]) == 0)
{
// command found, run its function
CmdTbl[ndx].func(parms);
}
}
}
// no valid command was found
if (ndx == NUM_CMDS)
Serial.println("UNKNOWN COMMAND");
Serial.println("RDY> ");
}
这有效,但是我想做的是将命令解释器封装在C 类中。但是我无法通过类方法设置SCommand表。我最近的尝试是:
//在文件cmdhandler.h
中class CmdHandler;
typedef struct {
char *name;
int (CmdHandler::*func)(char* args);
} sCOMMAND;
class CmdHandler
{
public:
CmdHandler(int buf_size);
~CmdHandler(void) { if (m_Buf) delete [] m_Buf; };
void ProcessCommand (char *cCmd);
private:
char *m_Buf;
int m_BufSize;
char *parms[MAX_PARMS];
void ParseCommand(char *cCmd, char* (&parms)[MAX_PARMS]);
int func_1(char* args);
int func_2(char* args);
int func_3(char* args);
sCOMMAND CmdTbl[3];
};
//在文件中cmdhandler.cpp
#include "CmdHandler.h"
CmdHandler::CmdHandler(int buf_size)
: CmdTbl{ {"RST", func_1},
{"ACC", func_2},
{"DEC", func_3} }
{
m_BufSize = buf_size;
m_Buf = new char[m_BufSize];
}
void CmdHandler::ProcessCommand (char *cCmd)
{
}
在ARM GCC CPP编译器上,这给出了一个错误"cannot convert 'CmdHandler::func_1' from type 'int (CmdHandler::)(char*)' to type 'int (CmdHandler::*)(char*)'".
如果我将指针参考从结构中取出:
typedef struct {
char *name;
int (CmdHandler::func)(char* args);
} sCOMMAND;
我得到
"CmdHandler.h: invalid use of incomplete type 'class CmdHandler'
int (CmdHandler::func)(char* args);".
任何人都可以告诉我如何解决这个问题,还是建议任何更好的方法?
与非成员功能不同,成员功能不会衰减以函数指针。因此,您需要使用:
CmdHandler::CmdHandler(int buf_size)
: cmd_tbl{ {"RST", &CmdHandler::func_1},
{"ACC", &CmdHandler::func_2},
{"DEC", &CmdHandler::func_3} }
{
m_BufSize = buf_size;
m_Buf = new char[m_BufSize];
}
相关文章:
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- std::vector的包装器,使数组的结构看起来像结构的数组
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 找到两对数字,使它们的乘积的绝对差最小化
- C++:如何使函数只返回作为列表一部分的字符串
- Python中的for循环与C++有何不同
- c++使用foreach使数组为null
- 使外部项目可用于find_package CMake
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 是否可以在C++中使变量真正只读
- 有可能使shared_ptr协变吗
- 使lambda不可复制/不可移动
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 如何使用OpenMP使这个循环并行
- 根据变量使Qt UI中的复选框为已选中/未选中
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 如何使一系列功能在C 中指示私有
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定