2014-02-08 4 views
1

Привет всем :) У меня есть проблема с указателями на функции
Мои аргументы функции «обратного вызова» являются:
1) функция, как это: междунар (* FX) (целое, ИНТ)
2) INT переменный: Int а
3) другой ИНТ: ИНТ б
Ну, проблема в том, что функция, которую я хочу, чтобы перейти к «обратному вызову» не является статическим членом функции :(и там есть много проблем
Если у кого-то умнее меня есть время, он может посмотреть мой код :)C++ Передача указателя на нестатической функции члена

#include <iostream> 
using namespace std; 

class A{ 
private: 
    int x; 
public: 
    A(int elem){ 
     x = elem; 
    } 

    static int add(int a, int b){ 
     return a + b; 
    } 

    int sub(int a, int b){ 
     return x - (a + b); 
    } 
}; 

void callback(int(*fx)(int, int), int a, int b) 
{ 
    cout << "Value of the callback: " << fx(a, b) << endl; 
} 

int main() 
{ 
A obj(5); 

    //PASSING A POINTER TO A STATIC MEMBER FUNCTION -- WORKS!! 
    // output = 'Value of the callback: 30' 
    callback(A::add, 10, 20); 

    //USING A POINTER TO A NON-STATIC MEMBER FUNCTION -- WORKS!! 
    int(A::*function1)(int, int) = &A::sub; 
    // output = 'Non static member: 3' 
    cout << "Non static member: " << (obj.*function1)(1, 1) << endl; 

    //PASSING A POINTER TO A NON-STATIC MEMBER FUNCTION -- aargh 
    // fallita! tutto quello sotto non funziona --> usa i funtori??? 
    // puoi creare una classe wrapper ma non riuscirai mai a chiamare da callback 
    int(A::*function2)(int, int) = &A::sub; 
    int(*function3)(int, int) = obj.*function2; //[error] invalid use of non-static member function 
    callback(function3, 1, 1); 
} 

Есть способ создать мой указатель так, как я пытался писать, например, int (* fx) (int, int) = что-то?
Я искал много, но никто не мог дал мне ответ (ну, был ответ: «НЕТ», но я все еще думаю, что я могу сделать что-то)

Я слышал также о функторах, может им помочь меня в этом случае?

Благодаря любому
PS: извините за мой плохой английский

EDIT1: я могу использовать что-то вроде этого:

template <class T> 
void callback2(T* obj, int(T::*fx)(int, int), int a, int b) 
{ 
    cout << "Value of the callback: " << (obj->*fx)(a, b) << endl; 
} 
void callback2(void* nullpointer, int(*fx)(int, int), int a, int b) 
{ 
    cout << "Value of the callback: " << fx(a, b) << endl; 
} 

и в моей основной:

callback2(NULL, &mul, 5, 3); // generic function, it's like: int mul(int a, int b){return a*b;} 
callback2(NULL, &A::add, 5, 3); //static member function 
callback2(&obj, &A::sub, 1, 1); //non static member function 

Я не совсем доволен, потому что я не хочу передавать свой «callback2» первый параметр (объект) ...
Вопрос, для людей, которые не понимают мое (плохое) объяснение, заключается в следующем: могу ли я удалить первый параметр в моей функции callback2?
прототип будет

void callback2(int(*fx)(int, int), int a, int b)<br> 

и я буду называть так:

callback2(&obj.sub, 1, 3); 
+2

, что «этот путь»? и почему это помечено знаком 'c'? –

+0

@ H2CO3 - Ты будешь так же плох, как и я! –

+0

@EdHeal: P (это не моя цель быть плохим, но, честно говоря ... вы понимаете, что этот парень спрашивает или что он даже пытается сделать, потому что, честно говоря, я этого не делаю.Я также не понимаю, почему это не первое, что люди делают, когда вы получаете ошибку компилятора для сообщения об ошибке в Google. Я просто не понимаю, почему нет.) –

ответ

0

Функции, которые нельзя ссылаться так:

int (*function3)(int, int) = obj.*function2; 

Вы должны пройти адрес функции:

int (*function3)(int, int) = std::mem_fn(&A::sub, obj); 
//       ^^^^^^^^^^^^^^^^^^^^^^^^^ 

Выражение function2 распадается на указатель на функцию, которая позволяет ему работать.

+1

Я не могу заставить его работать :(неверное преобразование из int (A :: *) в int (*) – incud

+0

Хорошо, это работает :) Мне просто нужно было что-то изменить, но теперь работает. Спасибо – incud

0

Я хотел бы сделать это с StD функторов, вот простой пример, основанный с вашего кода:

#include <iostream> 
#include <functional> 
using namespace std; 

class A{ 
private: 
    int x; 
public: 
    A(int elem){ 
     x = elem; 
    } 

    static int add(int a, int b){ 
     return a + b; 
    } 

    int sub(int a, int b) const{ 
     return x - (a + b); 
    } 
}; 

void callback(std::function<int(const A& ,int,int)> fx, A obj, int a, int b) 
{ 
    cout << "Value of the callback: " << fx(obj, a, b) << endl; 
} 

int main() 
{ 
A obj(5); 


    std::function<int(const A& ,int,int)> Aprinter= &A::sub; 

    callback(Aprinter,obj,1,2); 
} 
+0

Этот код в порядке, но я могу изменить функцию «обратного вызова». Невозможно передать «обратный вызов» только функцию, которая ссылается на мой объект? – incud

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