如果我有:
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
答案 0 :(得分:3)
你需要输入一个像这样的指针类型:
typedef void (MyClass::*FnPointer)(int);
并创建一个这样的指针:
FnPointer pnt = &MyClass::myFunction;
可以像这样调用该函数:
MyClass obj;
(obj.*pnt)( 3 );
我不知道OP是否有目标,或者只是在玩,但这种方法对于创建回调或委托非常有用。一个结构将保存并初始化一个引用或指向类实例的指针,以及一个指向该类成员函数的指针。
答案 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)。