静态成员函数指针,用于保存非静态成员函数
Static member function pointer to hold non static member function
这打败了我。我想要一个静态类变量,它是指向(非静态)成员函数的指针。我已经尝试了各种方法,但没有运气(包括使用 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 的命名空间中
相关文章:
- 如何在C++中使用非静态成员函数作为回调函数
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 为什么传递非静态成员函数会导致编译错误?
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- std::异步与非静态成员函数
- C++无效使用非静态成员函数?
- 未使用的C++未优化的静态成员函数/变量
- C++:如何返回指向非静态成员函数的指针?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 在 stream_descriptor::async_wait 中无效使用非静态成员函数
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 在类定义中推导内联静态成员函数的返回类型
- `enable_if()`以禁用模板化类的静态成员函数声明
- 错误:无效使用非静态成员函数"int test::hotplug_callback(libusb_contex
- 常量静态成员函数
- 使用 vector.sort() 的非静态成员函数无效使用
- 从静态成员函数访问私有非静态类变量 - C++