误解函数指针 - 将其作为参数传递

时间:2010-03-19 08:29:05

标签: c++ function-pointers

我想通过函数指针作为参数将类A的成员函数传递给类B.请告知这条道路是否在某处领先,并帮助我填补坑洼。

#include <iostream>


using namespace std;

class A{
public:

int dosomeA(int x){
    cout<< "doing some A to "<<x <<endl;
    return(0);
}
};

class B{
public:

B(int (*ptr)(int)){ptr(0);};
};

int main()
{
A a;
int (*APtr)(int)=&A::dosomeA;

B b(APtr);
return 0;
}

这段精彩的代码让我忘记了编译错误:

  

无法在初始化

中转换int (A::*)(int)' to int(*)(int)'

首先我希望它能够编译 其次,我不希望dosomeA成为STATIC。

2 个答案:

答案 0 :(得分:6)

指向成员的指针与普通函数指针不同。由于编译器错误表明&A::dosomeA的类型实际上是int (A::*)(int)而不是int (*)(int)

B的构造函数中,您需要一个A的实例来使用.*->*运算符调用该成员。

E.g'

B(int(A::*ptr)(int))
{
    A atmp;
    (atmp.*ptr)(int);
}

答案 1 :(得分:3)

http://www.parashift.com/c++-faq-lite/pointers-to-members.html

您没有指向返回int并接受int的函数的指针。你有一个指向成员函数的指针,它返回一个int并取一个A *和一个int。您不仅需要修改指针的类型,B还需要提供A *作为dosomeA的this参数。

Boost :: bind有一些功能,通常用于简化函数指针的使用,它们支持指向成员函数的指针。请参阅here