2012-04-06 4 views
0
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(); 
} 

Der Ausgang Output: 15, Output: 18, zu einer Klasse Zeiger zuweisen soll, ist die Sache Zusammenhang mit this wirft Fehler zu erhalten.Erster Kontext von „dieser“ in einer Klasse und theClass *

Jemand weiß, wie man das repariert?

Antwort

2

kann ich ein paar Probleme mit Ihrem Code sehen:

Erstens erfordert static_cast<> einen Typ in der <> und this wirkt wie eine Variable (so kein Typ). Der Typ this ist classe* (Zeiger auf classe Objekt) innerhalb classe.

Zweitens gibt es keine context in . Es gibt einen Parameter für classe::fuct() mit diesem Namen, aber das ist nicht verfügbar, wo Sie es verwenden möchten.

Drittens nimmt pthread_create() eine freie Funktion (oder eine statische Elementfunktion) an und Sie stellen eine Klassenmemberfunktion (classe::funct) bereit. Klassen-Memeber-Funktionen erfordern ein Objekt, an dem gearbeitet werden soll (eine Art wie ein impliziter Parameter == this). Sie haben auch kein t in classe::Go() definiert, die Sie pthread_create()

passieren könnte Sie könnten versuchen:

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(); 
} 
+0

Es muss keine freie Funktion sein, ein statisches Element funktioniert einwandfrei. – Josh

+0

Danke, aktualisiert – Attila

1

Zuerst müssen Sie irgendwo context definieren. Zweitens ist this ein Schlüsselwort, das einen Zeiger auf das Objekt darstellt, für das die Elementfunktion aufgerufen wird. static_cast erfordert einen Typ im Template-Argument. Ersetzen Sie static_cast<this> durch static_cast<classe*>, und ändern Sie den Typ von c in classe *, damit die Anweisung kompiliert wird.

0

Sie scheinen ein wenig verwirrt darüber, wo einige der wichtigsten Teile gehen. Hier ist ein grobes Skelett, von dem ich denke, dass es das meiste von dem macht, was Sie wollen.

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

so etwas wie dieses Versuchen:

#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; 
} 

zog ich den Kontext auf die richtige Funktion und hinzugefügt, um die pthread_join so wird das Programm nicht beendet werden, bevor die Fäden eine Chance zu laufen haben.

Verwandte Themen