如何在类中有一个函数指针?

时间:2011-11-25 10:15:38

标签: c++

“错误:无效使用非静态数据成员'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 个答案:

答案 0 :(得分:3)

你对pthreads的使用很好,你在这里没有指向成员函数的指针。

问题在于您尝试使用非静态成员变量作为函数的默认参数,you can't do that

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.

默认参数必须是“基本上 - 全局”,或者至少是一个不需要限定的名称。

幸运的是,它很容易解决!

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);
  }
};

答案 1 :(得分:0)

使用非静态成员函数t无法执行此操作。

您可以做的是通过class thread参数将t的指针传递给void *。或者,如果您还有t的其他参数,则可以将它们全部包含在结构中(包括指向class thread的点)并传递结构实例的指针。

正如其他人所说,只有extern "C"函数符合pthread_create的需要。