Bonjour, j'ai des problèmes avec une fonction virtual que je redéfinit, mais qui provoque un seg fault à l'exécution.
En faisant des recherches, j'ai trouvé ce post là
Ce qui semble être mon problème... j'ai donc mis ma fonction en virtuel pure, histoire que le compilateur m'indique l'erreur, mais tout ce qu'il me dit c'est ça
Ce que je ne comprend pas. et n'arrive pas à corriger, de plus je n'ai pas compris les expliquations de swoog, donc je repose à nouveau la question...
Code : Sélectionner tout - Visualiser dans une fenêtre à part build/albumindex.o:(.rodata._ZTI10AlbumIndex[typeinfo for AlbumIndex]+0x8): undefined reference to `typeinfo for IHttpCommunication'
Voici mon code :
j'ai un objet HttpCommunicator, qui peut communiquer avec mon site internet, les objets de mon appli qui veulent l'utiliser, doivent implémenter l'interface IHttpCommunication
Dés lors, quand ils voudront communiquer, il passeront par mon objet HttpCommunicator, qui stocke un pointeur vers l'objet qui fait une requete, afin qu'il le prévienne quand la communication est terminée.
Voici le code :
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 // L'interface que doivent implémenter tout les objets qui veulent utiliser le HttpCommunicator class IHttpCommunication { public : virtual void httpCommunicationDone(bool error) = 0; }; // Le singleton HttpCommunicator, qui communique avec mon site class HttpCommunicator : public QObject { Q_OBJECT // Singleton private: HttpCommunicator(QObject * parent = 0); HttpCommunicator( const HttpCommunicator & ); HttpCommunicator & operator =( const HttpCommunicator & ); public : static HttpCommunicator & GetInstance(); void startHttpCommunication(IHttpCommunication * client, QString url, QFile * httpResponse); public slots: void saveHttpResponse(int processKey, bool error); private: QHttp * http; QHash<int, IHttpCommunication *> communicationsStack; };
le cpp
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 HttpCommunicator::HttpCommunicator(QObject * parent) : QObject ( parent ) { http = new QHttp(); communicationsStack = QHash<int, IHttpCommunication *>() ; // Handle signals connect(http, SIGNAL(requestFinished(int, bool )), this, SLOT(saveHttpResponse(int, bool ))); http->setHost(ABS3G_HOST); } /** * Retourne l'instance du singleton HttpCommuicator. * @return HttpCommunicator & */ HttpCommunicator & HttpCommunicator::GetInstance() { static HttpCommunicator instance; return instance; } /** * Cette méthode est appelé par les Objets qui veulent communiquer avec le site (ces * objets doivent implémenter IHttpCommunication et fournir un pointeur vers eux-même). * Le HttpCommunicator se charge de transmettre le message */ void HttpCommunicator::startHttpCommunication(IHttpCommunication * client, QString url, QFile * httpResponse) { // lancer la requete http (stocker la réponse dans le fichier fournis) int processKey = http->get(url, httpResponse); // Stocker id communication pour pouvoir prévenir l'objet quand elle sera terminée communicationsStack[processKey] = client; } /** * Cette methode est automatiquement appelé quand une communication internet * est terminée. Elle se charge alors de prévenir l'objet à l'origine de cette * communication, et le préviens que le travail est terminé, et qu'il peut analyser * la réponse. * @param bool error, indique si il y a eu une erreur pendant la discution * @return void */ void HttpCommunicator::saveHttpResponse(int processKey, bool error) { if (error) qDebug() << http->errorString(); // Récupérer le client correspondant à la clé QHash<int, IHttpCommunication *>::const_iterator i = communicationsStack.find(processKey); if (i != communicationsStack.end() ) { // Client trouvé, on le prévient : i.value()->httpCommunicationDone(false); // On supprime l'entrée dans le QHash communicationsStack.remove(processKey); } else { //... pas de client trouvé qDebug() << "bad processKey"; } }
et voici le code d'un objet qui doit implémenter IHttpCommunication
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 class AlbumIndex : public IHttpCommunication { public: AlbumIndex(); void httpCommunicationDone(bool error); void initFromHttpDatas(); private: QFile * file; QList<Album> albumsIndex; }; AlbumIndex::AlbumIndex() { QFile * file = new QFile("allAlbumsDatas.xml"); QList<Album> albumsIndex; if (!file->open(QIODevice::WriteOnly)) { QMessageBox::information(0, "HTTP", file->errorString()); delete file; file = 0; return; } qDebug() << "fichier cree et ouvert"; } void AlbumIndex::initFromHttpDatas() { // Récupérer toutes les données des albums (et des photos) afin de construire l'app HttpCommunicator::GetInstance().startHttpCommunication(this, URL, file); // Analyse de la réponse (DOM) // ... } void AlbumIndex::httpCommunicationDone(bool error) { qDebug() << "AlbumIndex::HttpCommunicationDone "; // ... }
Voilà,
Si vous voulez plus de précision dites le...
Mais là je sèche depuis plusieurs jours sur cette même erreur, et je tourne en rond :s
Tout ce que je sais, c'est qu'il y a un problème au moment où je fait à appel à la méthode virtual qu'aurait du surcharger mon ALbumIndex... Vu que le QHash contient des IHttpCommunication, c'est comme si il chercher à exécuter la méthode virtuel pure de mon interface, sans chercher à appelé la méthode redéfini de mon objet ...
Partager