gpt4 book ai didi

c++ - 无法从类型 void*(classname::) () 转换为类型 void*(*)(void*)

转载 作者:可可西里 更新时间:2023-11-01 17:22:59 26 4
gpt4 key购买 nike

class Scoreget{
private:
//some variables
public:
Scoreget(){
//something here
}

void* basicgetscore(){
//somthing here
}

void getscore(Scoreget s){
pthread_t t;
if(pthread_create(&t,NULL,s.basicgetscore,NULL)==-1){
printf("Error 3\n");
exit(3);
}
void *a;
if(pthread_join(t,&a)==-1){
printf("Error \n);
exit(4);
}
}
};

我试图运行一个单独的线程来调用函数,因为它使用对 execl() 的调用,因此会停止我的程序(我在 Windows 上,不能使用 fork())。将线程与类结合起来给我带来了困难。

通过谷歌搜索,我了解到我需要将最后一个函数设为友元函数或静态函数,并使用某种 this 指针。我已经尝试过,但碎片不适合。我什至无法更改错误类型。现在让我很沮丧。得到同样的错误:

cannot convert Scoreget::basicgetscore from type void*(Scoreget::)() to type void* (*) (void *)

最佳答案

将其声明为静态的,并添加另一个辅助方法:

static void* basicgetscore(void * object){
return ((Scoreget *) object)->dobasicgetscore();
}

void * dobasicgetscore() // new helper method
{
// do stuff here
return NULL;
}

创建线程:

if (pthread_create(&t,NULL,basicgetscore,&s) == -1) { ...

另外,要非常小心。你给这个线程一个临时变量的地址。在这种特定情况下是安全的,因为 pthread_join 在同一个函数中,但是如果您要在线程退出之前从该函数返回,您将释放正在运行线程的对象,这可能会导致各种恶劣的行为。考虑将您的函数更新为 1) 获取引用或指针或 2) 对 this 进行操作。

关于c++ - 无法从类型 void*(classname::) () 转换为类型 void*(*)(void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12043057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com