C ++指向类方法的指针

时间:2014-10-10 18:42:31

标签: c++ class methods function-pointers

我想做这样的事情:

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 :: *处理程序的东西,但我无法正确理解语法。我一直遇到这样的错误:

"error: no matching function for call to 'CLI_Command::CLI_Command(const char [4], <unresolved overloaded function type>)"

5 个答案:

答案 0 :(得分:3)

这说明了正确的语法:

class CLI;

struct CLI_Command
{
    CLI_Command(char* s, void (CLI::*h)(void))
    {
        command_string = s;
        handler = h;
    }

    char* command_string;
    void (CLI::*handler)(void);

    void raise( CLI* the_cli ) { return (the_cli->*handler)(); }
};

class CLI
{
    public:
        CLI();

    private:
        static CLI_Command cli_table[NO_CLI_COMMANDS];

        void handler1(){};
        void handler2(){};
};

CLI::CLI_Command cli_table[NO_CLI_COMMANDS] = {
  { "Command1",   &CLI::handler1 },
  { "Command2",   &CLI::handler2 }
};

成员函数的名称不会衰减为指向成员的指针。在创建指向成员的指针时,必须明确使用&和限定名称。

答案 1 :(得分:2)

除了其他答案,另一个选项是std::functionstd::bind()一起使用:

struct CLI_Command{
    ...
    std::function<void> handler;
};

class CLI {
    ...
    CLI_Command cli_table[NO_CLI_COMMANDS] = {
      { "Command1",   std::bind(&CLI::handler1, this) },
      { "Command2",   std::bind(&CLI::handler2, this) }
    };

    void handler1(){};
    void handler2(){};
};

答案 2 :(得分:1)

void handler1(){}
void handler2(){}

CLI的成员函数。 “解决”这些问题的正确方法是&CLI::handler1而不是handler1。但是,void (*h)(void)不会接受这些内容,而void (CLI::*h)(void)需要将其更改为handler1/handler2。但这可能不是你想要的。

也许可以考虑阅读std::function类型擦除,或​​者让{{1}}静态。

答案 3 :(得分:1)

您应该使用指向类成员的指针的语法,而不是松散函数指针的语法。

class CLI;

struct CLI_Command{
    CLI_Command(char* s, void (CLI::*h)(void)){
        command_string = s;
        handler = h;
    }

    char* command_string;
    void (CLI::*handler)(void);
};

此外,请确保通过当前CLI类的指针调用该函数;

void CLI::process(char *cmd) {
    CLI_Command command* = /* lookup the command */
    this->(command->handle)();
}

答案 4 :(得分:0)

要使其正常运行,请制作方法static

static void handler1(){};
static void handler2(){};

无论后果如何(read here请更详细信息)这将有:-(。