IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Probleme "undefined reference to `vtable for Atomes'"


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut Probleme "undefined reference to `vtable for Atomes'"
    Bonjour/bonsoir à tous.

    J'ai un petit soucis de programmation. Je suis limite "newbie" dans le domaine, puisque c'est un exercice de TP, et la majeure partie étant faite par la prof.. ^^' Bref, elle n'a pas réussi à m'expliquer comment résoudre mon probleme de vtable.

    voici l'erreur :

    obj\Debug\main.o||In function `_ZN18FonctionNVariablesD0Ev'
    C:\Users\Prophete\Desktop\test c++\TP4\main.cpp.text$_ZN6AtomesD1Ev[Atomes::~Atomes()]+0xb)||undefined reference to `vtable for Atomes'|
    C:\Users\Prophete\Desktop\test c++\TP4\main.cpp.text$_ZN6AtomesD2Ev[Atomes::~Atomes()]+0xb)||undefined reference to `vtable for Atomes'|
    C:\Users\Prophete\Desktop\test c++\TP4\main.cpp.text$_ZN6AtomesC2Ei[Atomes::Atomes(int)]+0x1f)||undefined reference to `vtable for Atomes'|
    C:\Users\Prophete\Desktop\test c++\TP4\main.cpp.text$_ZN6AtomesC1Ei[Atomes::Atomes(int)]+0x1f)||undefined reference to `vtable for Atomes'|
    ||=== Build finished: 4 errors, 0 warnings ===|

    voici les fichiers sources dans le fichier ZIP.

    J'espère que vous pourrez m'aider!!
    Je vous remercie tous d'avance ^^


    PS :
    - J'ai cherché sur google, et donc aussi sur le forum.. Et disons que j'ai "rien compris" aux solutions. Notament celle qui parle d'utiliser moc où d'autre... Mon niveau est vraiment mauvais ^^'

    - Les fichiers "vecteur.h" et "vecteur.cpp" sont fournis pré-fait, donc il n'y a pas d'erreur dedans.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Honnêtement, si le code présenté est en grosse partie fourni par le prof, il y a vraiment de quoi se poser des questions sur sa compétence sur le sujet (ou alors, c'est toi qui rêvais énormément pendant les cours "théoriques", et qui n'a rien compris à ce qu'elle t'expliquait )

    Déjà, le destructeur de la classe FonctionVariable (quel drôle de nom pour une classe ) devrait soit être public et virtuel, soit protégé et non virtuel (cf: cette entrée de la FAQ, et cette autre), et il en va de même pour toutes les classes qui dérivent de manière directe ou indirecte de FonctionVariable (Atmomes et dérivées)

    Ensuite, et c'est sans doute là que prend la naissance de ton problème, la fonction potentiel de la classe Atomes n'est pas définie (mais est déclarée comme fonction virtuelle).

    Il y a donc deux possibilités:
    Soit tu transforme cette fonction en fonction virtuelle pure, avec pour conséquence de rendre ta classe Atome abstraite (et donc nécessité de redéfinir cette fonction pour les classes dérivées qui devront être instanciables)... Allez, encore un petit coup de FAQ
    Soit tu fournis un "comportement de base" qui soit adapté aux atomes "sans autres information"

    De plus, mais ce n'est désormais plus qu'un détail, je ne suis pas vraiment persuadé qu'il soit opportun de faire hériter un atome (si tel est bien l'utilisation qui est faite de la classe de même nom) d'une... fonction variable.

    Enfin, mais bon, est-ce que cela change encore quelque chose ,je suis des plus surpris de rencontrer le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Atomes (int init): FonctionNVariables(2*init) {init=n_at;};
    pour le constructeur, car il modifie la variable locale init, après que son utilisation en a pris fin, et... juste avant de quitter la fonction (et donc, avant que la variable init soit détruite) ... Cela n'a strictement aucun sens, et ce, d'autant plus qu'il lui assigne... une valeur non initialisée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    effectivement,

    j'ai mal lu l'énoncé ^^'


    Déclarez une méthode virtuelle pure virtual double potentiel(double deltax, double deltay)=0; qui représente le potentiel V (∆x, ∆y) de l'équation (4.8).

    donc j'ai mis cette fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Atomes: public FonctionNVariables
    {
        protected :
    	int n_at; //nombre d'atomes
     
    public:
    	Atomes (int init): FonctionNVariables(2*init) {init=n_at;};
    	Vecteur init_P(double R);
    	void ecrire_coord(const Vecteur& P,const char* fichier_atomes);
    	virtual double potentiel(double deltaX, double deltaY)=0;
    	double eval(const Vecteur& P);
    };

    cela donne donc comme erreur : (cette fois je suis sous linux ^^' )

    thode num/TP4/main.cpp||In function ‘int main()’
    thode num/TP4/main.cpp|115|erreur: cannot declare variable ‘A’ to be of abstract type ‘Atomes’|
    thode num/TP4/Atomes.h|14|note: because the following virtual functions are pure within ‘Atomes’
    thode num/TP4/Atomes.h|22|note: virtual double Atomes::potentiel(double, double)|
    ||=== Build finished: 1 errors, 0 warnings ===|

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    C'est donc que tu essaye d'instancier un Atome, or, c'est devenu une classe abstraite vu que tu as une fonction virtuelle pure (virtual double potentiel( double deltaX, double deltaY ) = 0 ; )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    je tente quelques petites modif, mais cela me donne d'autres erreurs... Je vais essayer continuer a voir ce qu'il y a à modifier ^^

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Ashitaka26 Voir le message
    je tente quelques petites modif, mais cela me donne d'autres erreurs... Je vais essayer continuer a voir ce qu'il y a à modifier ^^
    Si tu ne nous en dis pas d'avantage sur ce que tu as modifié ou sur les erreurs que tu obtiens, nous aurons du mal à t'aider à apporter une solution

    Ceci dit, pour en revenir à ton problème d'impossibilité de déclarer un objet de type Atome:

    Si tu déclares une fonction virtuelle pure (c'est ce que représente le fameux =0 qui suit ta fonction potentiel ), tu indiques deux choses au compilateur:

    1- que tu ne dispose pas des données nécessaires pour définir le comportement (sinon, on peut croire que tu l'aurais défini )

    2- que les classes qui héritent de la classe que tu définis et que tu souhaite pouvoir instancier devront définir ce comportement.

    Cela revient strictement à dire au compilateur "je sais que les classes dérivées disposeront d'un comportement nommé (le nom de la fonction), mais là, je ne peux absolument pas le fournir!!!

    Le compilateur, de manière générale, a horreur du vide et, si tu as une classe pour laquelle un comportement n'est pas définis, il refusera purement et simplement de créer une instance de cette classe, car il ne saura pas que faire si, d'aventure, tu décide d'invoquer cette fonction (du moins, lorsqu'il est au courent, sinon, c'est l'éditeur de liens qui se plaindra de ne pas trouver le symbole correspondant dans le code binaire ).
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    nah je suis perdu la...

    maintenant j'ai :

    thode num/TP4/main.cpp||In function ‘int main()’: |
    thode num/TP4/main.cpp|129|erreur: cannot declare variable ‘A’ to be of abstract type ‘Atomes’|
    thode num/TP4/Atomes.h|9|note: because the following virtual functions are pure within ‘Atomes’: |
    thode num/TP4/FonctionNVariables.h|42|note: virtual double FonctionNVariables::eval(const Vecteur&)|
    ||=== Build finished: 1 errors, 0 warnings ===|
    Je sais plus où et quoi faire.
    Pour avoir cette erreur, j'ai amputer le programme des parties faisant appel à :

    // virtual double potentiel(double deltaX, double deltaY)=0;
    // double eval(const Vecteur&P);

    ainsi que les 2 classes AtomesVdW et AtomesCov ....

    une idée? (c'est à rendre pour demain ~~ je le sens mal)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Error] undefined reference to `vtable for ?
    Par Some0ne dans le forum C++
    Réponses: 1
    Dernier message: 20/01/2011, 00h34
  2. Réponses: 1
    Dernier message: 19/07/2009, 22h37
  3. undefined reference to `vtable for Graphique'
    Par lilly91 dans le forum Débuter
    Réponses: 11
    Dernier message: 23/06/2009, 17h41
  4. undefined reference to `vtable for
    Par zalalus dans le forum Qt
    Réponses: 13
    Dernier message: 27/05/2009, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo