我正在写一个简单的实验代码来测试将一个类的成员函数分配给另一个类的成员函数指针。我的示例代码无法编译。编译器显示错误:* '&':绑定成员函数表达式操作非法。*
我看到有些人在传递一个指向成员函数的指针时会这样做(&ClassB::printFun)。它对我不起作用,因为printFun不是一个静态成员函数。我也看到有人使用std::bind。但是std库对我来说不是一个选择,因为我将使用它来编写内核模式代码。我一直在寻找正确的方法来做到这一点有一段时间了,有人可以帮助我吗?谢谢!
using namespace std;
class ClassA
{
public:
ClassA(void(*callBack)(int));
void (*funPtr)(int);
};
ClassA::ClassA(void(*callBack)(int))
{
funPtr = callBack;
}
class ClassB
{
public:
void printFun(int a)
{
cout << a << endl;
}
};
int main()
{
ClassB classB;
ClassA classA(&classB->printFun);
classA.funPtr(5);
return 0;
}
2条答案
按热度按时间hi3rlvi21#
指向函数的指针和指向成员函数的指针是不同的东西。你需要一个对象来调用成员函数。
一个指向meber函数的指针可以这样声明:
你可以这样称呼它:
或者这个:
你能做的就是使用
std::function
代替老式的函数指针。你可以将一个lambda函数传递给std::function
,在其中调用类的方法:除了lambda函数,你也可以使用
std::bind
和std::placholder
作为参数:当然,您也可以向
std::function
传递一个简单的函数答案扩展:不使用STL的解决方案
谢谢你的信息。我使用std库打印的实验代码。但是我正在写的实际代码是在内核模式下,所以我将不能访问std库。我想知道是否有其他方法可以做到这一点。
如果你不想使用STL,你可以考虑使用抽象基类的解决方案。你需要一个带有抽象回调方法的基类,你需要两个覆盖抽象回调方法的派生类。回调方法的实现将回调委托给函数或类方法。
抽象方法
CallBack
的抽象类:函数指针的实现。重写的方法
CallBack
将回调委托给函数指针:方法函数指针的实现。被重写的方法
CallBack
将回调委托给一个对象和一个方法函数指针:两种情况的使用示例:
ldxq2e6h2#
我还没有编译过,所以不确定它有多准确,但我会在现代编译器中努力实现类似这样的东西(C++17之前仍然):