Win7的
cygwin gcc(GCC)4.8.2 64位(2000 C ++)
我正在尝试为成员函数构造一个typedef:
class MyClass {
typedef int32_t (*func1)(class const * const name);
typedef int32_t (func2)(class const * const name);
public:
int32_t memberFunc(class const * const name);
}
MyClass:: someFunc() {
func1 x, y;
x = &memberFunc; // error: address of non-static member illegal
y = memberFunc; // error: conversion error
func2 z;
z = memberFunc; // error: invalid use of member function
}
我查看了以前的帖子,他们指出func1定义是正确的,并且赋值(x =& memberFunc)也是正确的 - 至少对于非成员函数。如果可以,我宁愿不使memberFunc静态。那么,有什么好的例子和任何好的解释吗?
感谢 领域
答案 0 :(得分:1)
实际上,成员函数接收另一个参数:this
指针。所以正常的函数指针和成员函数指针是不同的。 member function-poineter语法如下:
typedef int32_t (MyClass::*func1)(MyClass const * const name);
,使用方法如下:
func1 f = &MyClass::memberFunc;
MyClass c;
MyClass *pc = &c;
(c.*f)(nullptr);
(pc->*f)(nullptr);
PS。 class const * const name
< - 您输错了?我认为不是课,而是MyClass
编辑:您可以按如下方式使用std::bind
:
MyClass c;
auto f = std::bind(&MyClass::memberFunc, &c /*this pointer*/);
在此,f
不是成员函数指针,而是binder函数对象。
答案 1 :(得分:0)
函数指针无法绑定到成员函数。
您需要一个指向成员的指针功能,或者更容易使用的功能,例如std::function
和std::bind
的调用。
答案 2 :(得分:0)
你需要所谓的closure来实现这一目标。
实际上,函数的地址不足以调用非静态类函数,因为实例化的对象具有非本地存储。因此,要实际调用成员函数,您还需要一个this
指针。
其他地方已经解释过了,但我想我会投入技术术语。包装函数地址和必要参数(即this
指针)以满足类函数的调用约定的任何东西都是闭包的实现。