2014-02-08 78 views
1

大家好:)我有一个问题与函数指针
我“回调”函数的参数是:
1)这样的函数:int(* FX)(INT, INT)
2)int变量:整数一个
3)另一INT:整数b
好了,问题是,我想传递给“回调”函数是一个非静态函数成员:(和有是很多问题
如果有人比我聪明有一些时间花费,他可以看我的代码:)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)= something?
我搜索了很多,但没有人可以给我一个答案(当然,有一个回答:“NO”,但我仍然认为我可以做一些事情)

我也听说过仿函数,可以帮助他们我在这种情况下?

由于任何人
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'标记? – 2014-02-08 23:37:52

+0

@ H2CO3 - 你会和我一样糟糕! –

+0

@EdHeal:P(我的目标不是要成为坏人,而是老实说......你明白这个人究竟在问什么,或者他甚至想要做什么?因为坦率地说,我不知道。我也不明白为什么当人们在编译器错误到谷歌错误信息时做的第一件事情。我只是不明白为什么。) – 2014-02-08 23:41:01

回答

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

我将与性病函子做,这里是一个基于关你的代码一个简单的例子:

#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

这段代码没什么问题,但我想修改'回调'函数。不可能仅通过“回调”函数来引用我的obj函数? – incud

相关问题