在类Class1
的头文件中,我声明了一个函数指针fn_ptr
和一个名为myfunc(int,int)
的函数:
class Class1
{
private:
bool (*fn_ptr)(int,int);
public:
Class1(); //Default Constructor
bool myfunc(int,int);
};
我希望在类的库文件中fn_ptr
指向Class1
的myfunction定义如下:
Class1::Class1()
{
fn_ptr = myfunc; //Initialization in the
}
Class1::myfunc(int a, int b)
{
return a<b;
}
编译导致错误:
error: argument of type 'bool (Class1::)(int,int)' does not match 'bool (*)(int,int)'
答案 0 :(得分:2)
正如用户4581301在评论中写道的那样,一旦你拥有了一个(非static
)成员函数,就需要一个&#34;隐藏&#34;指向该类对象的指针,因此您无法直接执行此处尝试的操作 - 界面不匹配。
此外,目前有更方便的功能间接设施,只有指针。
假设您执行以下操作。首先,声明这样的类:
#include <functional>
using namespace std;
class Class1
{
private:
std::function<bool(int, int)> fn;
public:
Class1(); //Default Constructor
bool myfunc(int,int){ return true; }
};
请注意成员fn
的类型std::function
如何,这样更方便,更通用。
现在在构造函数中,您只需使用lambda function:
进行初始化即可Class1::Class1() :
fn([this](int i, int j){return myfunc(i, j);})
{
}
它表示对于任何i
和j
,只需在这些参数上调用myfunc
(在this
objet上),然后返回结果。
完整代码
确保使用c ++ 11设置构建。
#include <functional>
using namespace std;
class Class1
{
private:
std::function<bool(int, int)> fn;
public:
Class1(); //Default Constructor
bool myfunc(int,int){ return true; }
};
Class1::Class1() :
fn([this](int i, int j){return myfunc(i, j);})
{
}
int main()
{
Class1 c;
}
答案 1 :(得分:1)
除了@Ami关于使用std::function
的优秀答案之外,成员函数指针具有不同的语法,这就是为什么它不适合你。
bool (Class1::*fn_ptr)(int,int); //note the Class1::
fn_ptr = &Class1::my_func; //the &Class1:: is necessary, forgetting it is a compilation error
调用它也是不同的。它需要调用类的实例。
Class1 c;
(c.*fn_ptr)(1, 2); //or (this->*fn_ptr) too