我正在尝试使用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);
}
答案 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