0

我试图将静态成员函数分配给仿函数,如下所示:

 class myClass
 {
   public: 
     static void (myClass::*fptr)();
     static void myFun()
     {

      }
 };

 (void (myClass::*)()) myClass::fptr = &myClass::myFun; // doesn't work

 int main()
 {
   myClass obj;
   myClass::fptr = &myClass::myFun;   // neither does this works
   return 0; 
 }

上述任务无效。

至少要检查静态成员函数的类型(因为我不确定)我写了以下语句main

myClass::fptr = &myClass::myFun;

VS2010 智能感知显示:

you can't assign a void ( * )() type to an entity of type void (myClass::*)()

我认为静态函数的类型应该是后者(void ( * )()

我也无法弄清楚如何为 a 提供定义,static functor因为它应该为静态数据成员完成。

我将仿函数设为静态,因为我希望它独立于 myClass 的任何实例。

有人可以详细说明这个主题static functors以及静态成员函数的类型(至于为什么会void(*)()出现这种情况)。甚至可以有一个指向静态成员函数的函数指针吗?

编辑

我能够通过使用来解决这个问题typedef

typedef void(*ptr)();
class myClass
{
 ....
 static ptr fptr;
};

ptr myClass::fptr = & myClass::myFunc;

但是为什么仍然是静态成员函数的类型void( * )()

4

4 回答 4

0

由于该方法是静态的,因此您必须使用函数指针而不是方法指针:

(void (*f_pointer)()) = &myClass::myFun;
于 2013-08-29T15:11:14.510 回答
0

静态成员函数的行为类似于非成员函数。例如,静态成员函数中没有 this 指针。写作

void (MyClass::*func) () = ...

简化函数的签名看起来像

void func(MyClass* thisObj);

但是由于没有进一步的参数,您需要使用普通语法。

使用普通函数指针:

void (*func)() = myClass::myFun;

或更好:

typedef void (*FPtr)();
FPtr func = myClass::myFun;

更好一些了:

function<void()> func = myClass::myFun;

比更好更好:

auto func = myClass::myFun;

编辑:我刚刚搜索了标准,但只找到了

(8.3.3/3) A pointer to member shall not point to a static member of a class (9.4), a 
member with reference type, or "cv void."
于 2013-08-29T15:19:06.727 回答
0

类方法有一个隐藏参数 - 指向相应类对象的指针,因此您必须在指针声明中指定类。另一方面,静态方法没有这样的隐藏参数,因此您可以像使用常规函数一样使用它们。

此代码将起作用:

class myClass
{
  public: 
    static void (*fptr)();
    static void myFun()
    {
      }
};

void (* (myClass::fptr))()  = &myClass::myFun;
于 2013-08-29T15:21:33.340 回答
0

这里有两个关键问题。

首先是myClass::fptras的声明static void (myClass::*fptr)()。这是一个静态数据成员,它是一个返回 void 的成员函数指针。您需要一个静态数据成员,它是一个返回 void 的函数指针。声明应该是static void (*fptr)().

另一个问题是缺少的东西。您没有定义(在内存中创建空间)该静态数据成员。您需要一个文件范围声明,类似于void (*myClass::fptr)();void (*myClass::fptr)() = &myClass::myFun;

于 2013-08-29T15:22:16.593 回答