2

如果我有:

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
4

3 回答 3

3

您需要 typedef 一个指针类型,如下所示:

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

并像这样创建该类型的指针:

FnPointer pnt = &MyClass::myFunction;

该函数可以这样调用:

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

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

请参阅:什么是 C++ 委托?

于 2013-06-26T14:44:02.507 回答
0

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

尝试typedef void (*pointer)(int);在类的声明中,然后通过MyClass::pointer.

于 2013-06-26T14:37:53.417 回答
-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;or 或auto pointer = <the lambda>.

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

于 2013-06-26T16:07:39.727 回答