将类的函数指针成员初始化为同一个类的函数成员

时间:2016-02-24 06:58:46

标签: c++

在类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)'

2 个答案:

答案 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);})
{

}

它表示对于任何ij,只需在这些参数上调用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