静态成员函数指针用于保存非静态成员函数

时间:2012-06-28 03:08:42

标签: c++

这打败了我。我想有一个静态类变量,它是一个指向(非静态)成员函数的指针。我已经尝试了各种各样的方法,但没有运气(包括使用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
}

3 个答案:

答案 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的命名空间