2015-03-12 3 views
0

В приведенной ниже строке command_rq, которая не компилируется, как я могу вызвать функцию в этом случае? Как мне изменить функцию, чтобы заставить ее работать?Как передать переданную функцию (функция ptr передана как аргумент функции)

#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(); 
} 
+6

'(команда _-> * RQ)();' – user657267

ответ

0

Надлежащий sytax это:

(command_->*rq)(); 

Однако, ваш код не будет компилироваться, так как эти линии являются незаконными:

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

Указатели на функции-члены имеют im укажите этот параметр, и вы не сможете передать его в своих вызовах.

Вы должны изменить функцию, чтобы взять указатель на объект Command, так что переданный указатель функции есть объект, он может быть «призвал»:

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_); } 

Вы также можете получить вокруг него путем объявления функций как статических и создания простого указателя на функцию 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(); 
} 
+0

Ваш ответ был не совсем правильно, потому что класс обработчик имеет элемент PTR повелевать объект. Команда (команда _-> * rq)(); синтаксис в doX работает без вашего другого материала. –

+0

Ха, вы правы. На прошлой неделе он не будет компилироваться на моей машине, но теперь это произойдет. Я, должно быть, что-то изменил, чтобы сломать его, но бог знает, что это было. –

-1

Почему не просто:

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

Возможно потому, что 'doX' должен делать много больше ... – Deduplicator

Смежные вопросы