Problème :
Comment créer un fil de discussion pour une fonction membre de classe lorsque la fonction est invoquée à partir d'un vecteur d'instances de classe ?
Exemple de code et Erreur :
Considérez le code suivant :
class c { void *print(void *) { std::cout << "Hello"; } }; std::vector<c> classes; pthread_t t1; classes.push_back(c()); classes.push_back(c()); // Attempt to create a thread for c.print() pthread_create(&t1, NULL, &c[0].print, NULL); // Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"
Explication :
L'erreur se produit car les fonctions membres de la classe C ont un implicite ce paramètre, qui est passé en interne. Cependant, pthread_create() ne gère pas ce paramètre caché, provoquant une incompatibilité de type lors de la conversion de la fonction membre en pointeur de fonction.
Solution :
Il existe deux approches à ce problème :
Cette méthode n'a pas de paramètre this, car elle est associée à la classe elle-même, pas à une instance. Comme ceci :
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
Cette méthode utilise une fonction en dehors de la définition de la classe, qui peut accéder au la classe et ses membres aiment ainsi :
// Outside the class void c_print_wrapper(c *c_instance) { c_instance->print(); } ... c c1, c2; pthread_t t1; classes.push_back(c1); classes.push_back(c2); // Create the thread for c.print() using wrapper function pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!