class classe (){
public:
int key;
static void *funct(void *context){
printf("Output: %d, ", key);
}
void Go(){
classe c = static_cast<this>(context); //<- This doesn't work, Context of this-> goes here
pthread_create(&t, NULL, &classe::funct, c);
}
};
int main(){
classe c;
c.key = 15;
c.Go();
c.key = 18;
c.Go();
}
输出应为Output: 15, Output: 18,
,问题是让this
的上下文抛出错误。
有人知道如何解决这个问题吗?
答案 0 :(得分:2)
我可以看到您的代码存在一些问题:
首先,static_cast<>
需要<>
中的类型,而this
的行为类似于变量(因此不是类型)。 this
中的classe*
类型为classe
(指向classe
对象的指针)。
其次,context
中没有classe:Go()
可用。该名称有classe::fuct()
的参数,但在您想要使用它的地方不可用。
第三,pthread_create()
假设一个自由函数(或静态成员函数),并提供一个类成员函数(classe::funct
)。类memeber函数需要一个对象来处理(有点像隐式参数== this
)。您还没有t
中定义的classe::Go()
可以传递给pthread_create()
你可以尝试:
static void *funct(void *key){ // funct is now a free function, all data is provided to it
printf("Output: %d, ", *static_cast<int*>(key));
}
class classe ()
{
public:
int key;
void Go(){
pthread t;
pthread_create(&t, NULL, funct, &key); // pass (address of) key to funct
}
};
int main(){
classe c;
c.key = 15;
c.Go();
c.key = 18;
c.Go();
}
答案 1 :(得分:1)
首先,您需要在某处定义context
。其次,this
是一个关键字,表示指向调用成员函数的对象的指针。 static_cast
需要模板参数中的类型。将static_cast<this>
替换为static_cast<classe*>
,并将c
的类型更改为classe *
,以便编译语句。
答案 2 :(得分:1)
尝试这样的事情:
#include <stdio.h>
#include <pthread.h>
class classe
{
public:
int key;
static void* funct(void *context)
{
classe* c = static_cast<classe*>(context);
printf("Output: %d, ", c->key);
return context;
}
void Go()
{
pthread_t t;
pthread_create(&t, NULL, &classe::funct, this);
void* p = 0;
pthread_join(t, &p);
}
};
int main()
{
classe c;
c.key = 15;
c.Go();
c.key = 18;
c.Go();
return 0;
}
我使用上下文移动到正确的函数,并添加了pthread_join,因此在线程有机会运行之前程序不会退出。
答案 3 :(得分:0)
你似乎对某些关键部分的位置感到有些困惑。这是一个粗略的骨架,我认为你想做的大部分都是。
class classe {
public:
classe(int k) : key(k) { }
void Go() {
// where does "t" come from?
pthread_create(&t, NULL, &funct, static_cast<void*>(this));
}
private:
int key;
static void* funct(void* context) {
classe* self = static_cast<classe*>(context);
printf("Output: %d ", self->key);
return 0; // not sure this is what you want
}
};
int main() {
classe c(15);
c.Go();
}