2

クラスでメンバー関数を定義し、そのポインターを使用したいと考えています。静的メンバー関数を使用できることはわかっていますが、問題は、クラスの静的メンバーにしかアクセスできないことです。関数ポインターを取得できる静的メンバー関数以外の方法はありますか。


より具体的には、関数ポインターを入力として取得する、使用しているライブラリーがあります。メンバー関数を作成し、その関数ポインターをその外部ライブラリに割り当てたいと考えています。クラスのオブジェクトを作成するか、このポインターを使用してこれを行う必要がありますか?

4

2 に答える 2

6

メソッドのポインタを取得できますが、オブジェクトを使用して呼び出す必要があります

typedef void (T::*MethodPtr) ();
MethodPtr method = &T::MethodA;
T *obj = new T();
obj->*method();

非オブジェクトポインタが必要で、オブジェクトを使用する場合は、オブジェクトのインスタンスをどこかに格納する必要がありますが、使用できるオブジェクトは1つ(シングルトン)のみに制限されています。

class T {
  static T *instance;
public:
  T::T() {
    instance = this;
  }
  static void func() {
    instance->doStuff();
  }
  void doStuff() {}
};

ライブラリが関数ポインタのユーザーデータをサポートしている場合は、複数のインスタンスが存在する可能性があります

class T {
public:
  static void func(void *instance) {
    ((T*)instance)->doStuff();
  }
  void doStuff() {}
};
于 2013-01-14T08:58:58.140 に答える