-1

私はいくつかのサードパートコードを持っています:

class A(){
    public:
        void assingOnClickFunction(void (*function)(); 
};

そのコードでは何も変更できません。A::assingOnClickFunction()クラスBの私のメソッドを渡したいと思いvoid B::someFunction()ます。私は試しました(すべてBクラス内です!):

a->assingOnClickFunction(this->someFunction);

しかし、エラーが発生します:

関数呼び出しに引数リストがありません。'&B :: someFunction'を使用して、メンバーへのポインターを作成します

だから私はそれを次のように変更しました:

a->assingOnClickFunction(&B::someFunction);

しかし、今ではさまざまなタイプについてエラーが発生することがよくあります(void(*)()(&B::*)()

静的にすることはできませんB::someFunction()(非静的Bのメンバーとメソッドをたくさん使用します)!

だから、私に渡すオプションはありますか、 それを静的に変更せず、クラス内の何も変更しません(認識していない、認識できない、含む)B::someFunction() A::assingOnClickFunction()AABBA

4

3 に答える 3

3

渡したいメンバー関数がそうでないstatic場合は、それを行うことはできません。のメソッドはA、引数のない関数への関数ポインターを受け入れ、非静的メンバー関数には暗黙のthisポインター引数があります。

于 2013-02-05T20:23:30.967 に答える
2

オブジェクトの(非静的)メソッドを呼び出すには、オブジェクトと呼び出すメソッドの両方を知っている必要があります。

assingOnClickFunction()関数は関数へのポインターのみを受け取るため、必要な情報を関数に渡すことはできません。

オブジェクトのグローバルインスタンスにアクセスできる関数を実装し、それを介してメソッドを呼び出すなど、いくつかの恐ろしいハックに加えて、それを行うことはできません。

于 2013-02-05T20:26:29.553 に答える
1

メンバー関数へのポインターは、関数へのポインターではありません。関数へのポインタ型の引数を取る関数がある場合、メンバー関数へのポインタを使用して呼び出すことはできません。

于 2013-02-05T20:26:11.003 に答える