1

sfml ウィンドウ用のウィンドウ コンテナーを作成しようとしています。sfml に慣れていない場合、sfml ウィンドウはコピー不可のクラスであるため、たとえば std::vector 内に配置することはできません。

私はほとんどの作業を完了しましたが、window.Display() が呼び出されてウィンドウを更新する前に、open-gl 描画作業を行うある種のコールバック関数を実装しようとしています。

コールバック関数 (c または c++ バージョン) の構文について理解できません。誰かが私に例を説明してくれませんか?

さらに良いことに、関数 (ユーザーが定義する) をクラスの関数に渡すことができるように、クラスにコールバック関数を実装する方法の例を誰かが喜んで説明してくれますか?後でクラスから呼び出すことができます。

上記の文をより明確にするために、次の 3 つのことが必要だと思います。

1): ユーザーが定義する関数。例:

void doDrawing(){
    // do some open gl stuff
}

2:) 上記のユーザー定義関数の引数を取るクラス内の関数:

void setDisplayFunc( ?argument of a function? argument ){
    function_pointer pointer = argument;
}

「引数」のタイプがどうあるべきか、または「function_pointer」がどうあるべきかわかりません...これが私が最も行き詰まっているところだと思います!

3:) 上記で割り当てられた関数をクラスが呼び出す方法。

// Do the function which is pointed at by pointer, which is of the type 'function_pointer' ... Whatever function_pointer happens to be!

誰かが以前に glut を使用したことがある場合、次のような glut コールバック関数を実装しようとしていると思います。

void someDisplayFunction(){
    // do open gl stuff
}

glutDisplayFunc( someDisplayFunction );

上記の関数は、ユーザー定義関数の引数を取り、'glutPostRedisplay' を呼び出したときに実行します ...

これが理にかなっていることを願っています。できる限り多くの情報を含めようとしました。どんな助けでも大歓迎です。(:

4

3 に答える 3

4

C++11 を使用している場合は、std::functionを使用できます。

void setDisplayFunc(const std::function<void()>& function) {
    function(); // call the function
}

それは<functional>私が信じているので、覚えておいて#include <functional>ください。

また、私は関数ポインターの C スタイルの構文をいつも忘れがちなので、この種の状況で STL を使用するのが大好きです。他のオブジェクトを使用するのと同じように管理でき、C# などの高水準言語に近い (つまり、関数を渡すため)。

プロジェクトで C++11 を使用していない場合は、古い構文に固執しています。他の回答を参照して、使用方法を確認してください。

ただし、後で使用する場合は、パラメーターを受け取る関数、デフォルトのパラメーターを渡す関数などの構文のドキュメントを参照してください。今後の使用に役立つ場合があります。

于 2013-02-03T15:41:31.900 に答える
2

関数ポインタが必要です。あなたの場合:

typedef void (*function_pointer)();

それで、あなたは書くことができます:

void setDisplayFunc(function_pointer argument){
    function_pointer pointer = argument;
}

それを呼び出すには、次のようにします。

pointer();
于 2013-02-03T15:40:19.883 に答える
1

あなたがしたいことは、関数へのポインター、または関数ポインターを渡すことです。

typedef void (*function_pointer)();

のタイプでこれを試してくださいargument。ヘッダーを見ると、実際に glut がどのようにそれを行うかを確認できます。

于 2013-02-03T15:40:02.363 に答える