函数指针使用带参数的对象中的函数

时间:2015-04-08 04:21:30

标签: c++ function pointers

我一直在使用c ++中的函数指针,似乎发现了一些问题。我做了一个演示,用一个简单的例子重现错误。

我有头文件

class MyClass
{
public:
    void MyFunction(int i);
    MyClass();
    ~MyClass();
};

和cpp文件

#include "MyClass.h"
#include <iostream>
#include <functional>
using namespace std;

MyClass::MyClass()
{
    //doesn't work
    function<void(int)> func = &MyClass::MyFunction;
}

void MyClass::MyFunction(int i)
{
    cout << i << endl;
}

在cpp文件的构造函数中,我试图创建一个指向MyFunction的指针。它在第506行的函数文件中给出错误error C2664: 'void std::_Func_class<_Ret,int>::_Set(std::_Func_base<_Ret,int> *)' : cannot convert argument 1 from '_Myimpl *' to 'std::_Func_base<_Ret,int> *'。它可以使用无参数方法,但不能使用它们。有谁知道为什么,以及如何解决它?

2 个答案:

答案 0 :(得分:3)

您可以使用this并将正在构造的对象绑定到该函数。例如,如果你的构造函数看起来像这样:

MyClass::MyClass()
{
    function<void(int)> func = bind(&MyClass::MyFunction, this, placeholders::_1);
    func(6);
}

您创建了一个MyClass实例:

MyClass instance;

然后6将打印到stdout。

答案 1 :(得分:3)

您还可以在C ++ 11中使用std::mem_fn,它将成员函数/变量包装到可调用的闭包中

#include <iostream>
#include <functional>

class MyClass
{
public:
    MyClass()
    {
        auto func = std::mem_fn(&MyClass::MyFunction);
        func(this, 42); // call it on the current instance
    }
    void MyFunction(int i)
    {
        std::cout << i << std::endl;
    }
};

int main()
{
    MyClass foo;
}

或者,您可以显式指定要调用成员函数指针的实例

MyClass()
{
    auto func = &MyClass::MyFunction;
    (this->*func)(42); // call it on the current instance
}

特别要注意,std::function<void(int)>不能转换为指向成员函数的指针。查看相关Using generic std::function objects with member functions in one class 这就是为什么将autostd::mem_fn一起使用可以消除所有的痛苦。