在类中获取“this”的上下文并分配给类指针TheClass *

时间:2012-04-06 01:31:40

标签: c++ class pthreads

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的上下文抛出错误。

有人知道如何解决这个问题吗?

4 个答案:

答案 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();
}