2013-05-09 4 views
1

Извините, что задал такой вопрос, поскольку я уверен, что на него ответили ранее, но я изо всех сил пытаюсь найти ответ, и это не из-за отсутствия взгляда. .. в любом случае ..Передайте нестатический указатель метода в качестве аргумента другому методу

class foo 
{ 
    void read(void (*func)(obj&)) 
    { 
     // many things happen to obj... 
     (*func)(obj); // Calls the function pointer to the handler. 
    } 

}; 
class bar : public foo 
{ 
    void handler(obj&) 
    { 
     // 
    } 
}; 

void main() 
{ 
    foo f; 

    typedef void (foo::*funcptr)(obj&); 
    funcptr ptr = &foo::handler; 

    f.read(ptr); ???? 
} 

так в основном, все, что я пытаюсь сделать, это передать метод нестатического члена с именем обработчик как функция указатель на метод чтения, так что, когда обратный вызов выполняются, вызывается обработчик.

Я пробовал всевозможные способы сделать эту работу и не хочу статических методов (по причинам, в которые я не буду вдаваться). Я думаю, что я довольно близко, но в конце концов упал! Любая помощь будет оценена по достоинству.

+1

Ознакомьтесь с FAQ lite, у них есть отличный раздел, посвященный этому: http://www.parashift.com/c++-faq/pointers-to-members.html – Constantin

ответ

1

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

Если у вас нет доступа к источнику класса foo, вы можете создать статическую функцию, которая вызывает функцию-член в объекте, хранящемся в хорошо известном местоположении (т. Е. В статической переменной). Если вы это сделаете, подумайте об изменении API, чтобы взять объект функции, аналогичный тому, что делают функции из стандартной библиотеки C++.

Наконец, существует общий подход, используемый в библиотеках C, которые принимают указатели на функции - передают дополнительный указатель void*, который будет передан обратно при вызове указателя на функцию; pthreads библиотека делает это. Если это так, вы можете создать struct, который обертывает целевой объект вызова и передает указатель на этот struct, который будет передан обратно вашей статической функции.

0

AFAIK Я не думаю, что существует какой-либо другой способ. Вам придется сделать метод статическим.

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