0

次のコードを使用して、オブジェクトの静的メソッドをコールバック関数として渡す必要があります。

glutDisplayFunc(callback)

callbackは、あるクラスの静的メソッドです- baseClass::callback()。それはうまくコンパイルされます。しかし今、同じコールバック関数を持つ派生クラス(baseClass親として持っている)が必要です。つまり、コールバック関数を上書きしたいのです。

派生クラスで上書きしましたが、呼び出さderivedClass::callback()れていません。

PS。glutDisplayFunc(callback)基本クラスで呼び出しています。コードは次のようになります。

baseClass::someFunction(){
    glutDisplayFunc(callback);
}

すべてのメソッドは静的derivedClass::callbackです。baseClass::callbackbaseClass?

4

2 に答える 2

2

C++ は仮想静的メソッドをサポートしていないため、実行しようとしていることを直接実行することはできません。できることは、関数ポインターを返す非静的仮想メソッドを作成し、派生クラスでそれをオーバーライドして、その静的コールバック メソッドへのポインターを返すことです。

つまり、次のようなものです。

class A
{
public:
   typedef void(*CallbackFunction)(void);

public:
   static void callback(void)
   {
      std::cout << "A::callback" << std::endl;
   }

   virtual CallbackFunction getCallback()
   {
      return callback;
   }

   void someFunction()
   {
      glutDisplayFunc(getCallback());
   }

};

class B: public A
{
public:
   static void callback(void)
   {
      std::cout << "B::callback" << std::endl;
   }
   CallbackFunction getCallback()
   {
      return callback;
   }
};

理想的とは言えませんが、コンテキスト パラメーターをサポートしない C コールバックの適切な回避策です。

于 2012-04-08T07:41:13.820 に答える
2

短い答えは、できないということです。さらに、通常はそうしたくありません。基本クラスは通常、特定の派生関数を直接認識すべきではありません。

これの通常のパターンは、仮想関数を呼び出す基本クラスに静的関数を持ち、派生クラスで仮想関数をオーバーライドすることです。ただし、それがここに当てはまるかどうかはわかりません-機能するには、コールバック関数に渡されるパラメーターを取得できる必要があります。渡すパラメーターはオブジェクトへのポインターであるため、それを基本オブジェクト型にキャストして戻し、そのポインターから正しい仮想関数を呼び出します。

ただし、glutDisplayFunc の特定のケースでは、それが可能だとは思いません。コールバック関数に渡されたパラメーターを取得することはできません。残念ながら、このスタイルのプログラミングを行いたい場合は、GLUT 以外のものに切り替える以外に本当の治療法はありません。

于 2012-04-08T07:34:54.360 に答える