2012-11-23 154 views
2

我已经查看了所有类似的问题,但是这个特定的情况似乎并没有出现。指定类函数的结构成员函数指针

我有一个插件系统,其中插件接收函数的地址,只要它想插入一个钩子(这是一个类函数)就可以调用。

插件:

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; 
    ... 
} 

经理调用到插件,如果插件需要插入任何挂钩,它需要打电话给经理。

这样做的正确方法是什么?我知道它正常工作(插件传递一个函数指针到类创建函数来请求一个插件对象),但它似乎我不能分配它由于它是一个类函数(使用非类功能,这项工作很好)。

我可以创建一个非类功能的朋友可以到经理,但我敢肯定,这可以直接做的,我只是不出来...

+0

你可以使用boost库吗? –

+0

提升是不可用的,因为它会依赖于插件设计 - 目的是最大限度地减少插件需要的工作量 – ZXcvbnM

回答

2

这些类型必须匹配:

typedef bool (manager::*InsertHookFunc)(hook_data*); 
bool (*insert_hook)(hook_data*); 

直接的解决办法是插入另一manager::plugin

bool (manager::*insert_hook)(hook_data*); 

最好的风格可能是移动typedefclass 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绝对是您的朋友与复杂类型的时候。

+0

这将是完美的,只有插件不知道经理:(经理是主机的一部分可执行文件,其中包括插件头文件 - 插件项目本身是完全独立的,只有插件头文件可用,所以插件不需要用管理器更新来重新编译 – ZXcvbnM

+0

是的,我认为这可能是如此...所以你不需要定义'manager'来说'typedef bool(manager :: * InsertHookFunc)(hook_data *);'或者定义或者使用' plugin'。只要使用前向声明:'struct manager;'在定义'header'之前' – Potatoswatter

+0

前向声明可以工作(虽然应该有..!),但插件仍然无法调用函数, s仍然没有经理定义 - 猜测我将不得不使用朋友功能。无论如何都值得一试,谢谢! – ZXcvbnM

0

功能您尝试使用是非静态功能不同类别(当它将被调用),这意味着要调用它,你需要的实例。

因此,对于要使非静态成员函数工作的函数指针,您需要传递一个指向实例的指针以及

,如果你做的函数(InsertHook)一免费朋友静态成员指针的定义将改变一样InsertHookFunc 你会称呼其为(ptr->*hook_func)(<insert arg here>)

或者,它会按照原样工作,您只需删除作业中的&即可。

0

您不能将通用函数指针指向非静态成员函数。这是因为所有非静态成员函数都有一个隐含的第一个参数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*) { ... } 
    ... 
};