c ++指向函数赋值的指针

时间:2013-06-26 14:34:54

标签: c++ pointers function-pointers

如果我有:

class MyClass {
 ...... my code....
private:
 void myFunction(int p);

}

in cpp file:

MyClass::MyClass() {

void (*pointer)(int);
pointer = &myFunction;

}

MyClass::myFunction(int p) {
//.... my code .... //
}

这可能吗? 我有一个任务问题:

cannot convert 'void(MyClass::*)(int)' to 'void (*)(int)' in assignment

3 个答案:

答案 0 :(得分:3)

你需要输入一个像这样的指针类型:

typedef void (MyClass::*FnPointer)(int);

并创建一个这样的指针:

FnPointer pnt = &MyClass::myFunction;

可以像这样调用该函数:

MyClass obj;
(obj.*pnt)( 3 );

我不知道OP是否有目标,或者只是在玩,但这种方法对于创建回调或委托非常有用。一个结构将保存并初始化一个引用或指向类实例的指针,以及一个指向该类成员函数的指针。

请参阅:What is a C++ delegate?

答案 1 :(得分:-1)

实际上,错误消息非常有助于告诉您出了什么问题。您声明了 function 指针,但您必须声明 method 指针。

在声明类时尝试typedef void (*pointer)(int);,然后按MyClass::pointer引用类型。

答案 2 :(得分:-2)

除非您利用其实现细节并使用reinterpret_cast,否则方法指针非常无用。如果你真的想这样做,请参见http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

现在,如果您正在运行c ++ 11,则可以使用lambda函数执行此操作。您可以使用void (*pointer)(int);std::function<void(int)> pointer;来代替auto pointer = <the lambda>

现在使用&myFunction而不是&MyClass::myFunction[&this](int a){return this->myFunction(a);};。然后,您可以将其分配给std :: function变量或类型推断变量(使用auto)。