Je commence juste à apprendre le C++ et j'essaye de rendre la classe Thread qui a les fonctionnalités de base de la classe Java Thread. Ce que j'essaie de faire est de créer une classe que vous sous-classez, d'écrire une méthode Run (qui est pure virtuelle dans la classe de base), créez un objet de la sous-classe appelez la méthode start et vous avez thread. Le problème est que dans la façon dont j'utilise C++, la répartition n'est pas faite correctement - c'est comme si la fonction Run n'est pas virtuelle, la méthode Run de la classe de base est appelée.Méthode virtuelle & this pointeur
Voici le code pour l'en-tête
#ifndef _THREAD_H_
#define _THREAD_H_
#include <pthread.h>
class Thread {
public:
Thread();
void Start();
~Thread();
protected:
virtual void Run() = 0;
private:
static void *RunWrapper(void *);
pthread_t thread;
};
#endif
La mise en œuvre
#include "thread.h"
#include <pthread.h>
Thread::Thread() {
}
void Thread::Start() {
pthread_create(&thread, NULL, Thread::RunWrapper, (void *) this);
}
void *Thread::RunWrapper(void *arg) {
Thread *t = (Thread *) arg;
t->Run();
return arg;
}
Thread::~Thread() {
pthread_join(thread, NULL);
}
Et le fichier qui essaie réellement de faire quelque chose
#include <iostream>
#include "thread.h"
class MyThread : public Thread {
protected:
void Run() {
std::cout << "The thread is runned" << std::endl;
}
};
int main(void) {
MyThread thread;
thread.Start();
return 0;
}
L'erreur que je continue à obtenir la 10 dernières heures est:
pure virtual method called
terminate called without an active exception
Si vous voulez vraiment copier la fonctionnalité Java, copiez le package java.util.concurrent à la place. Il a des concepts beaucoup plus avancés pour le multithread comme les exécuteurs, les contrats à terme, les verrous et les mutex. Mais si vous allez aussi loin, il suffit d'utiliser boost: il a déjà tout ce truc en place. –