你如何构造一个记住方法的typedef

时间:2014-01-02 02:21:33

标签: c++ typedef

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静态。那么,有什么好的例子和任何好的解释吗?

感谢 领域

3 个答案:

答案 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::functionstd::bind的调用。

答案 2 :(得分:0)

你需要所谓的closure来实现这一目标。

实际上,函数的地址不足以调用非静态类函数,因为实例化的对象具有非本地存储。因此,要实际调用成员函数,您还需要一个this指针。

其他地方已经解释过了,但我想我会投入技术术语。包装函数地址和必要参数(即this指针)以满足类函数的调用约定的任何东西都是闭包的实现。