3
class gfx { 
    void resize(int x, int y);
}

gfx g;    

g.resize を 'void (*)(int, int)' にキャストできますか?

4

2 に答える 2

6

gfx::resizeはタイプvoid(gfx::*)(int, int)です。void(*)(int, int)typeのオブジェクトのメンバー関数としてのみ呼び出すことができるため、意味のある型に変換することはできませんgfx

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

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

通常の関数ポインターを介してメンバー関数を呼び出すことができるようにする場合は、メンバーを呼び出すオブジェクトのインスタンスを渡すことができるパラメーターを使用して、非メンバー関数 (または静的メンバー関数) ラッパーを作成できます。関数。たとえば、次のようにすることができます。

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

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

于 2010-12-27T23:54:04.850 に答える
0

はい、できます:

void easy_resize(int x, int y) { g.resize(x, y); }
于 2010-12-28T00:15:02.883 に答える