Привет всем :) У меня есть проблема с указателями на функции
Мои аргументы функции «обратного вызова» являются:
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);
, что «этот путь»? и почему это помечено знаком 'c'? –
@ H2CO3 - Ты будешь так же плох, как и я! –
@EdHeal: P (это не моя цель быть плохим, но, честно говоря ... вы понимаете, что этот парень спрашивает или что он даже пытается сделать, потому что, честно говоря, я этого не делаю.Я также не понимаю, почему это не первое, что люди делают, когда вы получаете ошибку компилятора для сообщения об ошибке в Google. Я просто не понимаю, почему нет.) –