我试图将一个静态成员函数分配给仿函数,如下所示:
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 intellisense显示:
you can't assign a void ( * )() type to an entity of type void (myClass::*)()
我认为静态函数的类型应该是后者(void ( * )()
)
我也无法弄清楚如何为静态数据成员提供static functor
的定义。
我将仿函数设为静态,因为我希望它独立于myClass的任何实例。
有人可以详细说明static functors
的这个主题以及静态成员函数的类型(在这种情况下为什么它是void(*)()
)。是否有可能有一个指向静态成员函数的函数指针?
修改:
我可以使用typedef
:
typedef void(*ptr)();
class myClass
{
....
static ptr fptr;
};
ptr myClass::fptr = & myClass::myFunc;
但是为什么类型为静态成员函数void( * )()
?
答案 0 :(得分:0)
由于该方法是静态的,您必须在函数上使用指针而不是方法上的指针:
(void (*f_pointer)()) = &myClass::myFun;
答案 1 :(得分: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."
答案 2 :(得分:0)
类方法有一个隐藏参数 - 指向相应类对象的指针,因此必须在指针声明中指定类。 另一方面,静态方法没有这样的隐藏参数,因此您可以像使用常规函数一样使用它们。
此代码可以使用:
class myClass
{
public:
static void (*fptr)();
static void myFun()
{
}
};
void (* (myClass::fptr))() = &myClass::myFun;
答案 3 :(得分:0)
这里有两个关键问题。
第一个是myClass::fptr
作为static void (myClass::*fptr)()
的声明。这是一个静态数据成员,它是一个返回void的成员函数指针。您需要一个静态数据成员,它是一个返回void的函数指针。声明应为static void (*fptr)()
。
另一个问题是缺少的东西。您没有为该静态数据成员定义(在内存中创建空间)。您需要一个void (*myClass::fptr)();
或void (*myClass::fptr)() = &myClass::myFun;