如何在类中有函数指针?

Posted

技术标签:

【中文标题】如何在类中有函数指针?【英文标题】:How to have a function pointer inside a class? 【发布时间】:2011-11-25 10:15:38 【问题描述】:

“错误:无效使用非静态数据成员‘thread::tfun’”

Class thread 

  typedef void* (th_fun) (void*);

  th_fun *tfun;

  void create(th_fun *fun=tfun) 

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




如何在类中拥有函数指针?

请注意:- 静态减速将使代码编译。但我的要求是保存每个对象的功能。

【问题讨论】:

可能重复***.com/questions/8079453/… 不完全...我需要存储/修改它。改天使用。 为什么不直接使用boost::thread 【参考方案1】:

您对 pthread 的使用很好,而且这里没有指向成员函数的指针。

问题是您试图使用非静态成员变量作为函数的默认参数,而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);
  
;

【讨论】:

【参考方案2】:

你不能使用非静态成员函数t来做到这一点。

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

正如其他人所提到的,只有 extern "C" 函数才能满足 pthread_create 的需要。

【讨论】:

您不能将静态成员函数传递给pthread_create;如果您的编译器符合 C++ 标准,它将无法编译。你传递的函数必须是extern "C",成员函数,即使是静态的,也不能是。 哦,那会是个问题。我对pthread_create不太熟悉。

以上是关于如何在类中有函数指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何在类向量中存储/使用外部函数指针

在类中获取指向自身的指针

C++学习 之 类中的特殊函数和this指针

QT中使用函数指针

C++函数调用运算符 函数对象 函数指针

如何通过 C++ 中指向该数组的指针访问另一个类中的数组?