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

マネージャーはプラグインを呼び出します。プラグインがフックを挿入する必要がある場合は、マネージャーを呼び出す必要があります。

このようにするための正しい方法は何ですか?私はそれが正常に機能することを知っています(プラグインはプラグインオブジェクトを要求するためにクラス作成関数への関数ポインターを渡されます)が、それがクラス関数であるため(非クラス関数を使用して、この割り当ては正常に機能します)。

マネージャーの友達としてクラス以外の関数を作成することもできますが、これは直接実行できると確信しています。理解できません...

4

3 に答える 3

2

これらのタイプは一致する必要があります:

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

直接の修正は、manager::内部に別のものを挿入することですplugin

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複雑なタイプを扱うときは間違いなくあなたの友達です。

于 2012-11-23T05:52:13.573 に答える
0

使用しようとしている関数は、 (呼び出されるときに)別のクラスの非静的関数です。つまり、それを呼び出すには、クラスのインスタンスが必要です。

したがって、非静的メンバー関数への関数ポインターが機能するには、インスタンスへのポインターも渡す必要があります

InsertHookFunc ポインターの定義は、次のように呼び出すのと同じに変更されます(ptr->*hook_func )(<insert arg here>)

あるいは、 function( InsertHook) をfree friendまたはstatic member&にすると、そのまま機能します。代入でを削除するだけです。

于 2012-11-23T05:37:25.280 に答える
0

そのような非静的メンバー関数を指す一般的な関数ポインターを持つことはできません。これは、すべての非静的メンバー関数に暗黙的な最初の引数があるためthisです。はい、this関数で使用するポインターは、実際には関数の隠し引数です。

bool構造体で使用されるような型があるのでplugin、C++ コードをプラグインとして使用したいだけだと思います。その場合、単純にplugin構造をプラグインが継承できる抽象基本クラスにしないのはなぜでしょうか?

struct plugin
{
    ...
    virtual bool insert_hook(hook_data*) = 0;
    ...
};

class manager : public plugin
{
public:
    ...
    bool insert_hook(hook_data*) { ... }
    ...
};
于 2012-11-23T06:31:58.527 に答える