我已经浏览了所有类似的问题,但似乎没有出现这个特定的场景。
我有一个插件系统,插件会接收函数的地址,以便在想要插入钩子(Hook)(这是一个类函数)时调用。
插件:
struct plugin {
...
bool (*insert_hook)(hook_data*);
...
};
类别:
class manager {
...
private:
InsertHook(hook_data *hook);
...
};
管理器中的创建功能:
{
...
typedef bool (manager::*InsertHookFunc)(hook_data*);
InsertHookFunc hook_func = &manager::InsertHook;
// assigning this to the plugin ???
// C2440, cannot convert from 'hook_func' to 'bool (__cdecl *)(hook_data *)'
plugin->insert_hook = hook_func;
...
}
管理器调用插件,如果插件需要插入任何钩子(Hook),则需要调用管理器。
这样做的正确方法是什么?我知道它正常工作(插件将函数指针传递给类创建函数以请求插件对象),但似乎我无法分配它,因为它是一个类函数(使用非类函数,此分配工作正常)。
我可以创建一个非类函数作为经理的 friend ,但我确信这可以直接完成,我只是无法弄清楚......
最佳答案
这些类型需要匹配:
typedef bool (manager::*InsertHookFunc)(hook_data*);
bool (*insert_hook)(hook_data*);
直接修复方法是在 plugin
中插入另一个 manager::
:
bool (manager::*insert_hook)(hook_data*);
最好的风格可能是将typedef
移到类管理器
之外,如下所示:
struct manager; // allow manager to be referenced without its definition
typedef bool (manager::*InsertHookFunc)(hook_data*);
struct plugin {
...
InsertHookFunc insert_hook;
...
};
或者,如果插件已经看到 manager
的定义,则执行
manager::InsertHookFunc insert_hook;
typedef
在处理复杂类型时绝对是你的 friend 。
关于c++ - 将结构体成员函数指针赋值给类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523584/