[英]Assign struct member function pointer to class function
我已经浏览了所有类似的问题,但似乎没有出现这种特定情况。
我有一个插件系统,插件接收一个函数的地址,只要它想插入一个钩子(这是一个类函数)就可以调用。
插入:
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;
...
}
管理器调用插件,如果插件需要插入任何钩子,它需要调用管理器。
这样做的正确方法是什么? 我知道它正常工作(插件传递了一个指向类创建函数的函数指针以请求插件对象),但似乎我无法分配它,因为它是一个类函数(使用非类函数,这个任务工作正常)。
我可以创建一个非类函数作为经理的朋友,但我确定这可以直接完成,我只是想不通......
这些类型需要匹配:
typedef bool (manager::*InsertHookFunc)(hook_data*);
bool (*insert_hook)(hook_data*);
直接的解决方法是在plugin
插入另一个manager::
:
bool (manager::*insert_hook)(hook_data*);
最好的风格可能是像这样将typedef
移到class manager
之外:
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
绝对是您的朋友。
您尝试使用的函数是不同类的非静态函数(当它被调用时),这意味着调用它需要一个类的实例。
因此,要使指向非静态成员函数的函数指针起作用,您还需要将指针传递给实例。
指针的定义将更改为与InsertHookFunc
相同您可以将其称为(ptr->*hook_func )(<insert arg here>)
或者,如果您将函数( InsertHook
) InsertHook
自由友元或静态成员,它会按原样工作,您只需删除赋值中的&
。
你不能让通用函数指针指向这样的非静态成员函数。 这是因为所有非静态成员函数都有一个隐式的第一个参数this
。 是的,您在函数中使用的this
指针实际上是该函数的隐藏参数。
由于您的plugin
结构中使用了诸如bool
类的类型,我猜您只想将 C++ 代码用作插件。 在这种情况下,为什么不简单地使plugin
结构成为插件可以继承的抽象基类?
struct plugin
{
...
virtual bool insert_hook(hook_data*) = 0;
...
};
class manager : public plugin
{
public:
...
bool insert_hook(hook_data*) { ... }
...
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.