2013-08-29 205 views
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 (*)()

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

我让functor是静态的,因为我希望它独立于任何myClass实例。

请问有人可以详细说明static functors这个主题,以及静态成员函数的类型(至于为什么它是void(*)()在这种情况下)。它甚至有可能有一个静态成员函数的函数指针?

编辑

我能够通过使用来解决此一typedef

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

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

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

回答

0

作为该方法是静态的,则必须在方法使用一个指针上功能,而不是一个指针:

(void (*f_pointer)()) = &myClass::myFun; 
+0

的行的文件范围声明是的,我undestand。但为什么类型是这样呢? –

+0

(常规)方法有一个隐含的参数(this)。静态方法并非如此。 – Jarod42

0

静态成员函数的行为像非成员函数。例如。静态成员函数中没有这个指针。写

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

implifies功能的签名看起来像

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." 
0

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

此代码将工作:

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

void (* (myClass::fptr))() = &myClass::myFun; 
0

这里有两个关键问题。

第一种是myClass::fptr的声明为static void (myClass::*fptr)()。这是一个静态数据成员,它是返回void的成员函数指针。你想要一个静态数据成员,它是一个返回void的函数指针。声明应该是static void (*fptr)()

另一个问题是缺少的东西。您没有为该静态数据成员定义(在内存中创建空间)。您需要沿着void (*myClass::fptr)();void (*myClass::fptr)() = &myClass::myFun;