如何在类中有函数指针?
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
不太熟悉。以上是关于如何在类中有函数指针?的主要内容,如果未能解决你的问题,请参考以下文章