どのようにクラスの中に関数ポインタを持っているのですか?

"エラー:非静的データメンバー 'thread :: tfun'の無効な使用

Class thread {

  typedef void* (th_fun) (void*);

  th_fun *tfun;

  void create(th_fun *fun=tfun) {

    pthread_create(&t, NULL, fun, NULL);

}

}

どのようにクラスの中に関数ポインタを持っているのですか?

注意してください: - 静的な減速は、コードをコンパイルします。しかし、私の要件は、オブジェクトごとに関数を保持することです。

2
単に boost :: thread を使用するのはなぜですか?
追加された 著者 James Kanze,
重複している可能性があります。 stackoverflow.com/questions/8079453 /…
追加された 著者 Yousf,
正確には...私はそれを保存/変更する必要があります。他の時間を使用してください。
追加された 著者 rakesh,

2 答え

pthreadの使用は問題ありません。ここには、メンバー関数へのポインタはありません。

問題は、静的でないメンバ変数を関数のデフォルトパラメータとして使用しようとしていることです。それを行う

struct T {
   int x;

   void f(int y = x) {}
};
// Line 2: error: invalid use of non-static data member 'T::x'
// compilation terminated due to -Wfatal-errors.

The default argument must be something that's — essentially — a global, or at least a name that doesn't require qualification.

幸いにもそれは簡単な修正です!

Class thread {

  typedef void* (th_fun) (void*);
  th_fun* tfun;

  void create(th_fun* fun = NULL) {     //perfectly valid default parameter
     if (fun == NULL) {
        fun = tfun;                     //works now because there's an object
     }                                  //context whilst we're inside `create`

     pthread_create(&t, NULL, fun, NULL);
  }
};
3
追加された

非静的メンバー関数 t を使用して行うことはできません。

あなたができることは、 void * パラメータを通して class thread のポインタを t に渡します。または、 t に他のパラメータがある場合は、構造体のすべての点( class thread をポイントに含む)をラップし、構造体のインスタンスのポインタを渡すことができます。

他の人が触れたように、 extern "C" 関数だけが pthread_create の必要性に合っています。

0
追加された
静的メンバー関数を pthread_create に渡すことはできません。コンパイラがC ++標準に準拠している場合、コンパイルされません。渡す関数は extern "C" でなければならず、静的であってもメンバー関数はできません。
追加された 著者 James Kanze,
ああ、それは問題になるでしょう。私は pthread_create に慣れていません。
追加された 著者 fefe,