2011-12-19 30 views
2

今私はそれにOpenGLのMFCプログラムを書いています。そして、私はMFCとOpenGLを組み合わせしようとしたとき、私はいくつかの問題に遭遇: まず、私は名前のクラスに定義:CSCommTestDlgを、以下のようにコードを持つメンバ関数を定義した:C++のグローバル関数でメンバ関数を指す方法は?

void CSCommTestDlg::OpglMain(int argc, char* argv[]) 
{ 
    glutDisplayFunc(displayCude); 
} 

displayCubeもあります次のようにメンバークラスCSCommTestDlgの機能、およびglutDisplayFuncはグローバルfuncion(OpenGLの機能)で、glutDisplayFuncの関数の宣言は次のとおりです。

GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void)); 

はい、ちょうどあなたが見ることができるように、glutDisplayFuncのパラメータは関数ポインタであります、そして私はメンバーfunctioを指摘しました

error C2664: 'glutDisplayFunc' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)' 
    None of the functions with this name in scope match the target type 

iは、グローバル関数でメンバ関数を指すことができないようですが、私はそれを必要とする:nは違法と思われるdisplayCube、と私はそのようなエラーが発生しました。それを修正するには?

+0

['mem_fn'](http://en.cppreference.com/w/cpp/utility/functional/mem_fn)はどうですか? –

+0

私は個人的にglut以外のライブラリを使用するか、それらのコールバックに一致する関数呼び出しを持つ何らかの種類のGameオブジェクトを所有する静的関数(コールバック)を持つフレームワークを作成します。だから、glutとあなたのゲームとの間のインターフェースの一種。 (私はあなたがゲームのハハを書いているという前提を作ったと思う) –

+0

@JoachimPileborg:それはどのように質問者を助けるだろうか? –

答えて

2

glutDisplayFuncはグローバル関数をとるので、単純に言えば、メンバ関数ポインタを取ることはできません。

解決策の1つは、displayCubeに静的なマークを付けることですが、最初はクラスを持つ点がある程度残っています。

glut表示コールバックとしてグローバル関数を宣言し、その関数内でグローバルポインタを保持できる場合は、CSCommTestDlgオブジェクトのdisplayCubeメンバ関数を呼び出します。

1

ここでは、openglでMFCプログラムを作成しています。そして、私はopenglとMFCを組み合わせようとしました。

MFCまたは他のツールキットを使用している場合は、GLUTを使用しないでください。 GLUTはOpenGLの一部ではなく、あなたはそれを使う必要はありません。

と私はそれが違法と思われるメンバ関数displayCube、を指して作られた、と私はそのようなエラーました:当然

を。メンバ関数は、クラスインスタンスを呼び出す必要があるためです。生成されたマシンコードを見ると、最初のパラメータとして渡されたクラスインスタンスへのポインタがあるかのように見えます。だからあなたが実際に必要としたのは、いわゆるクロージャーでした。特徴ただはC++でサポートされていません。

動的に生成されるいくつかのコードトリッキーでクロージャをエミュレートすることは可能です。しかし、あなたの場合はこれは必要ではありません。GLUTと他のツールキットは混在しません。

関連する問題