如何调用函数传递(函数ptr作为参数传递给函数)

时间:2015-03-12 09:59:47

标签: c++ function-pointers

在下面的command_rq行中,无法编译,在这种情况下如何调用该函数?我如何更改功能才能使其正常工作?

#include <iostream>
using namespace std;

struct Command {
    bool RequestA() { cout << "RequestA\n"; return true; }
    bool RequestB() { cout << "RequestB\n"; return true; }
    bool RequestC() { cout << "RequestC\n"; return true; }
};

typedef bool (Command::*Request)();

class handler {
public:
    handler(Command* cmd) : command_(cmd) { }

    // *** How to now call specific function passed?
    void doX(Request rq) { command_->rq(); }
    void doA() { doX(&Command::RequestA); }
    void doB() { doX(&Command::RequestA); }
    void doC() { doX(&Command::RequestA); }
private:
    Command* command_;
};

int main() {
    Command* pCmd = new Command;
    handler h(pCmd);
    h.doA();
}

2 个答案:

答案 0 :(得分:0)

正确的sytax是这样的:

(command_->*rq)();

但是,您的代码无法编译,因为这些行是非法的:

void doA() { doX(command_->RequestA); }
void doB() { doX(command_->RequestA); }
void doC() { doX(command_->RequestA); }

指向成员函数的指针有一个隐含的参数,您无法在通话中传递它。

您必须更改函数以获取指向Command对象的指针,以便传递的函数指针具有一个对象,它可以被调用&#34;:

void doX(Request rq,Command* cmd) {
    (cmd->*rq)();
}
void doA() { doX(&Command::RequestA, command_); }
void doB() { doX(&Command::RequestB, command_); }
void doC() { doX(&Command::RequestC, command_); }

你也可以通过将函数声明为static并创建一个指向bool *函数的简单指针来绕过它。

class Command
{
public:
    static bool RequestA() { cout << "RequestA\n"; return true; }
    static bool RequestB() { cout << "RequestB\n"; return true; }
    static bool RequestC() { cout << "RequestC\n"; return true; }
};

typedef bool (*Request)();

class handler
{
public:
    handler(Command* cmd) : command_(cmd) { }

    // *** How to now call specific function passed?
    void doX(Request rq) {
                            (rq)();
                        }
    void doA() { doX(command_->RequestA);}
    void doB() { doX(command_->RequestB); }
    void doC() { doX(command_->RequestC); }

private:
    Command* command_;
};


int main(){

    Command* pCmd = new Command;
    handler h(pCmd);
    h.doA();
    h.doB();
    h.doC();
}

答案 1 :(得分:-1)

为什么不简单:

void doA() { command_->RequestA(); }