这打败了我。我想有一个静态类变量,它是一个指向(非静态)成员函数的指针。我已经尝试了各种各样的方法,但没有运气(包括使用typedef
,这似乎给了我一组不同的错误)。在下面的代码中,我有静态类函数指针funcptr
,我可以从类外部成功调用它,但不能从成员函数CallFuncptr
中调用它 - 这就是我想要做的。有什么建议吗?
#include <stdio.h>
class A
{
public:
static int (A::*funcptr)();
int Four() { return 4;};
int CallFuncptr() { return (this->*funcptr)(); }
// doesn't link - undefined reference to `A::funcptr'
};
int (A::*funcptr)() = &A::Four;
int main()
{
A fred;
printf("four? %d\n", (fred.*funcptr)()); // This works
printf("four? %d\n", fred.CallFuncptr()); // But this is the way I want to call it
}
答案 0 :(得分:3)
请改为尝试:
#include <iostream>
class A {
public:
typedef int (A::*AMemFn)();
static AMemFn funcptr;
int Four() { return 4; }
int CallFuncptr() { return (this->*funcptr)(); }
};
A::AMemFn A::funcptr = &A::Four;
int main()
{
A fred;
std::cout << "four? " << fred.CallFuncptr() << std::endl;
}
答案 1 :(得分:2)
jweyrich有一个漂亮的工作(我建议你使用它),但我想我会详细说明代码中的真正问题是什么:
你的问题就在这一行:
int (A::*funcptr)() = &A::Four;
这是定义一个名为funcptr
的全局变量,它是正确的类型,而不是A::funcptr
。
你需要的是这个烂摊子:
int (A::*(A::funcptr))() = &A::Four;
这个丑陋的混乱是为什么我建议你沿着typedef路径来获得像jweyrich的解决方案一样漂亮的版本。
答案 2 :(得分:0)
静态变量不是特定对象的成员 - 只能通过classes命名空间访问它。应该重写CallFuncptr:
int CallFuncptr() { return (*funcptr)();
我认为应该可以工作,因为这个函数可以访问A命名空间中的函数而不指定它。
此外,函数指针更多地是C构造而不是C ++。您可以使用以下代码访问类外部的静态变量:
A::CallFuncptr
因为CallFunctptr只是驻留在A的命名空间