使用指向成员函数C ++的函数将成员函数作为参数传递

时间:2016-06-24 16:11:28

标签: c++ function pointers member

我正在尝试使用pointer-to-member-function将成员函数作为参数传递。我已经看过像here这样的链接,但我无法解决问题。

Foo类有两个成员函数。我需要将addition函数作为参数传递给NewOper函数。 这是我的代码。我可以正确地使用指针来调用addition函数,但是当我尝试将它作为参数传递给NewOper函数时,它会给我一个错误。如果你告诉我如何解决它,我感激不尽。 (最后两行导致错误)

#include <iostream>
using namespace std;
class Foo{
public:
    int addition(int a, int b)
    {
        return (a + b);
    }

    int NewOper(int x, int y, int(*fnc2call)(int, int))
    {
        int r;
        r = (*fnc2call)(x, y);
        return (r);
    }
};
int main()
{
    int m,n, k, l;
    int (Foo::*fptr) (int, int) = &Foo::addition;
    Foo obj;
    m=(obj.*fptr)(1,2);
    Foo* p = &obj;
    n=(p->*fptr)(3,4);
    cout << m << endl;
    cout << n << endl;
    //**********************
    int (Foo::*fptr) (int, int, int(*fnc2call)) = &Foo::NewOper;
    k = (obj.*fptr)(1, 2, addition);
}

1 个答案:

答案 0 :(得分:1)

您已经在自己的代码中得到答案:

int (Foo::*fptr) (int, int) = &Foo::addition - 在这里你正确地声明了fptr作为函数的指针,它是类Foo的<非静态}成员

但是你忘记在NewOper函数定义中执行相同的操作:

int NewOper(int x, int y, int(*fnc2call)(int, int)) - 此函数需要 free 函数的地址作为第三个参数。按照声明fptr的方式重新定义它。但是你需要将指向Foo类对象的指针传递给这个函数

或者,您可以将函数addition函数设置为静态,如Jarod42建议的那样(实际上,它现在的编写方式,除非您有进一步的计划,否则它没有理由成为Foo类的成员) 。然后,您需要从Foo::定义

中删除fptr