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

Static member function pointer to hold non static member function

本文关键字:静态成员 函数 保存 指针 用于      更新时间:2023-10-16

这打败了我。我想要一个静态类变量,它是指向(非静态)成员函数的指针。我已经尝试了各种方法,但没有运气(包括使用 typedef s,这似乎给了我一组不同的错误)。在下面的代码中,我有静态类函数指针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? %dn", (fred.*funcptr)());  // This works
  printf("four? %dn", fred.CallFuncptr()); // But this is the way I want to call it
}

试试这个:

#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;
}

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

你的问题是这一行:

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

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

你需要的是这个烂摊子:

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

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

静态变量不是特定对象的成员 - 它只能通过类命名空间访问。CallFuncptr 应该重写: int CallFuncptr() { return (*funcptr)();我认为应该可以工作,因为此函数可以在不指定 A 命名空间的情况下访问函数。

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