簡體   English   中英

將結構成員函數指針分配給類函數

[英]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>)

或者,如果您將函數( InsertHookInsertHook自由友元靜態成員,它會按原樣工作,您只需刪除賦值中的&

你不能讓通用函數指針指向這樣的非靜態成員函數。 這是因為所有非靜態成員函數都有一個隱式的第一個參數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM