gpt4 book ai didi

c++ - 将非静态方法指针作为参数传递给另一个方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:13 26 4
gpt4 key购买 nike

很抱歉问这样的问题,因为我确定之前已经有人回答过这个问题,但我正在努力寻找答案而且这不是为了寻找......无论如何......

class foo
{
void read(void (*func)(obj&))
{
// many things happen to obj...
(*func)(obj); // Calls the function pointer to the handler.
}

};
class bar : public foo
{
void handler(obj&)
{
//
}
};

void main()
{
foo f;

typedef void (foo::*funcptr)(obj&);
funcptr ptr = &foo::handler;

f.read(ptr); ????
}

所以基本上,我要做的就是将名为 handler 的非静态成员方法作为函数指针传递给 read 方法,以便在执行回调时调用处理程序。

我已经尝试了各种方法来完成这项工作,但不想制作静态方法(出于我不会讨论的原因)。我想我已经很接近了,但最后有点倒下了!任何帮助将不胜感激。

最佳答案

您不能那样做:与可以自行调用的静态函数不同,成员函数的调用需要知道两件事 - 被调用的函数和调用它的对象。这就是为什么不可能将成员函数传递给需要“普通”函数指针的 API。

如果您无权访问 foo 类的源代码,您可以创建一个静态函数,该函数调用存储在众所周知位置(即静态文件中)的对象的成员函数多变的)。如果这样做,请考虑更改 API 以采用函数对象,类似于标准 C++ 库中的函数。

最后,在接受函数指针的 C 库中有一种常用的方法 - 传递一个额外的 void* 指针,该指针将在对函数指针的调用中传回; pthreads图书馆就是这样做的。如果是这种情况,您可以创建一个包装调用目标对象的 struct,并将指向此 struct 的指针传递给您的静态函数。

关于c++ - 将非静态方法指针作为参数传递给另一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16453094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com