2017-05-06 18 views
0

新しい関数が作成されるたびにWindowsのmainloopに関数を追加する必要なしに、関数を外部に描画する配列関数を書いた。配列関数ポインタでvoidを呼び出す

これはうまくいきますが、別のクラスのpublic void関数を指しているときは、 '非静的メンバー関数への参照を呼び出さなければなりません'と言います。

コード:

int main(int argc, const char * argv[]) 
{ 
    Window* win = new Window(800, 600, "3D Game Engine"); 
    Game game; 
    win->draw[0] = a; 
    win->draw[1] = game.render; 

    win->MainLoop(); 
    delete win; 
} 

Draw関数:

typedef void (*function_ptr)(int); 

function_ptr *draw = (function_ptr*)malloc(sizeof(function_ptr)); 

はそれを呼び出すための方法はありますか?

おかげ

+0

['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)を見てください。 – Angew

+0

「ウィンドウ」クラスの定義、特に「描画」配列の定義を投稿してください。 –

答えて

2

あなたは持っている問題は、以下のいずれかです。

void (*function_ptr)(int); 

はタイプintの一つの引数を持つ関数へのポインタです。

あなたはこのようなクラスのメソッドがある場合:

class exampleClass 
{ 
public: 
    void example(int a); 
}; 

A C++コンパイラはが内部が暗黙のthis引数で関数を生成します - ちょうどこのよう:(

void [email protected](exampleClass *this, int a); 

を内部的には、ほとんどのC++コンパイラは、これらの関数の名前では@のような不正な文字を使用しますが、ここでは問題ありません。

したがって、通常、この種の関数ポインタにクラスメソッドを割り当てることはできません。タイプ(exampleClass *,int)のファンクションをタイプ(int)のファンクションポインタに割り当てます。

これを避けるには、通常、コンパイラはクラスメソッドを関数ポインタにまったく格納できないようにします。

「全然」コンパイラはまた、あなたが正しい内部型の関数ポインタを使用することはできないことを意味します:

void (*function_ptr_2)(exampleClass *, int); 
exampleClass y; 

/* Not supported by the compiler although it is 
* theoretically possible: */ 
function_ptr_2 x1 = exampleClass::example; 
function_ptr_2 x2 = y.example; 

残念ながら私のC++の知識は、私はあなたを伝えることはできませんので、十分ではありませんifとAngewのソリューション(std::function)の仕組み

+0

参考になった読書:https://isocpp.org/wiki/faq/pointers-to-members – user4581301

関連する問題