1

这打败了我。我想要一个静态类变量,它是一个指向(非静态)成员函数的指针。我尝试了各种方法,但没有运气(包括使用typedefs,这似乎给了我一组不同的错误)。在下面的代码中,我有静态类函数指针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
}
4

3 回答 3

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;
}
于 2012-06-28T03:34:02.530 回答
2

jweyrich 有一个漂亮的工作(我建议你使用它),但我想我会详细说明代码中的真正问题是什么:

你的问题是这一行:

int (A::*funcptr)() = &A::Four;

这是定义一个名为的全局变量funcptr,它的类型是正确的,而不是A::funcptr.

你需要的是这个烂摊子:

int (A::*(A::funcptr))() = &A::Four;

这种丑陋的混乱就是为什么我建议你沿着 typedef 路径去获得一个像 jweyrich 解决方案这样漂亮的版本。

于 2012-06-28T03:41:52.183 回答
0

静态变量不是特定对象的成员——它只能通过类命名空间访问。CallFuncptr 应该重写: int CallFuncptr() { return (*funcptr)(); 我认为应该可以,因为这个函数可以访问 A 的命名空间中的函数而无需指定它。

此外,与 C++ 相比,函数指针更像是 C 构造。您可以使用代码访问类外部的静态变量: A::CallFuncptr 因为 CallFunctptr 只是驻留在 A 的命名空间中

于 2012-06-28T03:37:20.470 回答