2010-12-27 11 views

答えて

6

gfx::resizeは、void(gfx::*)(int, int)である。あなたはタイプgfxのオブジェクトのメンバ関数としてしか呼び出せないので、それを意味のある形でvoid(*)(int, int)に変換することはできません。

メンバ関数は、だけなので、あなたのgfx g;与え、あなたはg.resize()を呼び出すことができますが、それは普通の関数だったようにあなただけのresize()を呼び出すことはできません、クラスのインスタンスで呼び出すことができます。通常の関数ポインタは、クラスのインスタンスに関数呼び出しをバインドする方法がないため、メンバ関数を指すことはできません。

概念的には、メンバー関数は、呼び出されたクラスのインスタンスを指す追加のパラメータthisを引数としてとります。

通常の関数ポインタを介してメンバ関数を呼び出せるようにするには、オブジェクトのインスタンスを渡すことができるパラメータを持つ非メンバ関数(または静的メンバ関数)ラッパーを作成できます。メンバ関数を呼び出す。たとえば、あなたが持っている可能性があり:

void resize(gfx* obj, int x, int y) { 
    return obj->resize(x, y); 
} 

をこの非会員resize機能はvoid(*)(gfx*, int, int)型を持つ非メンバー関数として呼び出すことができます。このアプローチの一般化された形式は、std::functionstd::bindの施設がC++ 0xにあります(BoostとC++ TR1でも見つけることができます)。

+0

'void(*)(int、int)'には 'this'ポインタがありません。どのタイプ/インスタンスを実行するかを指定する必要があるため、署名も変更する必要があります。 –

+2

@メーリン:そうではありませんか? –

+1

はい。その日、私はその "メンバ関数"が "this"ポインタを取得することはありませんでした。それは私がそれを理解するために「これ」について明白なチュートリアルを読んでくれました。 Btw、私はupvoteでした。 –

0

はい、あなたはそれを行うことができます。

void easy_resize(int x, int y) { g.resize(x, y); } 
+1

私は今どのようにそれをやっているのですか?しかし、私は少しハッキーのように見える私のグラフィックスクラスへのポインタを追跡する必要があります –

+0

何のグラフィックスクラスが必要ですか?それをクラスにする必要がありますか?場合によっては、(クラスのメンバー関数ではなく)関数を持つだけでよい場合もあります。 –

関連する問題