Undefined reference to `vatable for RenduTroisD`

Undefined reference to `vatable for RenduTroisD` - C++ - Programmation

Marsh Posté le 13-07-2011 à 13:36:03    

Bonjour à tous et toutes,
 
Voila j'ai un problème en C++, je viens de commencer avec ce langage et ça fait 2 jours que je n'arrive plus a avancer. voila la structure de mon "projet" (en très simplifié) :
 
TroisDWidget.h - La classe mère

Code :
  1. class TroisDWidget : public QGLWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     explicit TroisDWidget(int framesPerSecond = 0, QWidget *parent = 0, char *name = 0);
  6.     ~TroisDWidget();
  7.     virtual void initializeGL() = 0;
  8.     virtual void resizeGL(int width, int height) = 0;
  9.     virtual void paintGL() = 0;
  10.     virtual void keyPressEvent( QKeyEvent *keyEvent );
  11. public slots:
  12.     virtual void timeOutSlot();
  13. private:
  14.     QTimer *t_Timer;
  15. };


 
TroisDWidget.cpp - Implémentation

Code :
  1. TroisDWidget::TroisDWidget(int framesPerSecond, QWidget *parent, char *name) : QGLWidget(parent){
  2.   ....
  3. }
  4. void TroisDWidget::timeOutSlot()
  5. {
  6. }
  7. void TroisDWidget::keyPressEvent(QKeyEvent* event) {
  8.     ....
  9. }
  10. TroisDWidget::~TroisDWidget(){}


 
RenduTroisD.h - Classe fille

Code :
  1. class RenduTroisD : public TroisDWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     explicit RenduTroisD(QWidget *parent = 0);
  6.     void initializeGL();
  7.     void resizeGL(int width, int height);
  8.     void paintGL();
  9. };


 
RenduTroisD.cpp - Implémentation

Code :
  1. RenduTroisD::RenduTroisD(QWidget *parent) : TroisDWidget(60, parent, "Rendu 3D" )
  2. {
  3.     // rien pour le moment
  4.     // l'erreur nous renvoie à ce constructeur
  5. }
  6. void RenduTroisD::initializeGL(){....}
  7. void RenduTroisD::resizeGL(int width, int height){...}
  8. void RenduTroisD::paintGL(){...}


 
Comme le dit le titre, l'erreur que je récupère est : "Undefined reference to `vatable for RenduTroisD`". Qui me redirige vers la ligne du constructeur : RenduTroisD::RenduTroisD(QWidget *parent) : TroisDWidget(60, parent, "Rendu 3D" ){}
 
 
J'ai pu lire et apprendre que cela voulait dire qu'il y a un problème de link au niveau de la table qui s'occupe des fonctions virtuelles. De plus, la plupart des gens sur internet qui ont eu se problème parlent de constructeurs ou destructeurs non valides. J'ai beau ajouter des constructeurs ou destructeurs partout, cela ne change pas grand chose à mon problème.
 
Quelqu'un pourrait m'aider ? Je ne sais vraiment plus quoi faire.
 
 
Merci infiniment.
Votre Soeur

Reply

Marsh Posté le 13-07-2011 à 13:36:03   

Reply

Marsh Posté le 13-07-2011 à 14:06:44    

Personnellement, je n'ai jamais rencontré ce type d'erreur, c'est peut-être spécifique à Qt ? Tu as essayé de relancer une passe de "qmake" ?
 
Ton destructeur dans la classe TroisDWidget devrait être déclaré "virtual", puisque tu dérives cette classe.
 
Hormis ces deux remarques, je ne vois pas ce qui cloche...

Reply

Marsh Posté le 13-07-2011 à 14:14:54    

Et puis au passage, rajoute un destructeur dans ta classe RenduTroisD, même s'il ne fait rien de spécial.

Reply

Marsh Posté le 13-07-2011 à 16:04:41    

il faut au moins un destructeur virtual dans ton bousin

Reply

Marsh Posté le 13-07-2011 à 17:11:07    

Bonjour et merci de m'avoir répondu.
 
J'ai ajouté à la classe mère (TroisDWidget.h) :

Code :
  1. virtual ~TroisDWidget();


et à TroisDWidget.cpp :

Code :
  1. virtual ~TroisDWidget();


 
Cela ne change en rien mon problème malheureusement. Concernant également la réponse sur qmake, j'ai bien validé, exécuté, relancé le qmake, cela ne change rien non plus....
 
J'ai redémarré mon ordinateur a cause des mise à jour Windows... et paff ça marche....
 
En tout cas ça semble marcher...
 
Avez vous une idée de pourquoi ça marché pas?
 

Reply

Marsh Posté le 13-07-2011 à 17:11:07    

Bonjour et merci de m'avoir répondu.
 
J'ai ajouté à la classe mère (TroisDWidget.h) :

Code :
  1. virtual ~TroisDWidget();


et à TroisDWidget.cpp :

Code :
  1. virtual ~TroisDWidget();


 
Cela ne change en rien mon problème malheureusement. Concernant également la réponse sur qmake, j'ai bien validé, exécuté, relancé le qmake, cela ne change rien non plus....
 
J'ai redémarré mon ordinateur a cause des mise à jour Windows... et paff ça marche....
 
En tout cas ça semble marcher...
 
Avez vous une idée de pourquoi ça marché pas?
 

Reply

Marsh Posté le 13-07-2011 à 22:39:46    

LaSoeur a écrit :

Bonjour et merci de m'avoir répondu.
 
J'ai ajouté à la classe mère (TroisDWidget.h) :

Code :
  1. virtual ~TroisDWidget();


et à TroisDWidget.cpp :

Code :
  1. virtual ~TroisDWidget();


 
Cela ne change en rien mon problème malheureusement. Concernant également la réponse sur qmake, j'ai bien validé, exécuté, relancé le qmake, cela ne change rien non plus....
 
J'ai redémarré mon ordinateur a cause des mise à jour Windows... et paff ça marche....
 
En tout cas ça semble marcher...
 
Avez vous une idée de pourquoi ça marché pas?
 


 
Le problème n'est pas réglé. Ton programme doit écrire à un endroit qui ne contient rien d'important, donc il ne plante pas. Si tu reboote, il pourra très bien replanter.
Mais je suis toujours d'avis d'attendre l'avis du mètre Jole F
 
cracoucoin
 

Reply

Marsh Posté le 16-07-2011 à 11:45:43    

LaSoeur a écrit :


Avez vous une idée de pourquoi ça marché pas?


 
Les voies de l'informatique sont impénétrables, MaSoeur...
 

cracoucoin a écrit :


Le problème n'est pas réglé. Ton programme doit écrire à un endroit qui ne contient rien d'important, donc il ne plante pas. Si tu reboote, il pourra très bien replanter.
Mais je suis toujours d'avis d'attendre l'avis du mètre Jole F
 
cracoucoin


 
Jusqu'ici, le programme ne passait pas la phase d'édition des liens... Ce n'est donc pas un problème d'exécution !

Reply

Marsh Posté le 16-07-2011 à 18:10:38    

Bonjour,
Ce genre de problème dépasse de loin mes compétences mais j'ai trouvé ce lien qui semble intéressant: http://www.daniweb.com/software-de [...] ads/114299


---------------
Seul Google le sait...
Reply

Marsh Posté le 16-07-2011 à 18:42:12    

virtual ~TroisDWidget() {}  
 
deja me parait mieux ... si tu ne fait que declarais et pas definir :/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed