【发布时间】:2014-10-10 18:42:31
【问题描述】:
我想做这样的事情:
struct CLI_Command{
CLI_Command(char* s, void (*h)(void)){
command_string = s;
handler = h;
}
char* command_string;
void (*handler)(void);
};
class CLI {
public:
CLI();
private:
CLI_Command cli_table[NO_CLI_COMMANDS] = {
CLI_Command("Command1", handler1),
CLI_Command("Command2", handler2)
};
void handler1(){};
void handler2(){};
};
我知道我需要类似于 CLI::*handler 的东西,但我无法正确使用语法。我一直遇到这样的错误:
"error: no matching function for call to 'CLI_Command::CLI_Command(const char [4], <unresolved overloaded function type>)"
【问题讨论】:
-
问题是你试图获取一个非静态成员函数的地址,这是不允许的。我最近有answered 一个类似的问题。也许它会帮助你。请注意,现代 C++ 提供了强大的工具,让您的程序更简洁、更安全。
-
@5gon12eder:获取非静态成员函数的地址是完全合法的,但结果是指向成员的指针,而不是函数指针。
-
@5gon12eder 好的,你能详细说明一下这些工具吗?或者指点我一个方向? :) 。我正在通过嵌入式设备上的 UART 创建命令行界面。
-
@BenVoigt 是的,这当然是正确的。所以不允许的事情是“将非静态成员函数的地址用作函数指针”。
-
@Jolle 例如,您可以将表设置为
std::map<std::string, Command>,其中Command可能是适当的typedef,或者 – 如果您想要更多的 OO 并且可以承受开销,请创建一个 @ 987654327@ 并将多态命令对象放入您调用虚函数的映射中。
标签: c++ class methods function-pointers