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 :

Err: undefined reference vtable for class


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut Err: undefined reference vtable for class
    Bonsoir
    je viens de commencer le c++ il y a a peu prés une semaine mais la je suis completement coincé avec l'appel d'un constructeur dans une classe qui s'appelle 'Mammifere' qui normalement herite de la class 'Animal' ce qui m'agace le plus c'est qu'il y a une autre classe 'Oiseau' qui marche ss souci !!voila le .h des classes

    'Mammifere' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <string>
    #include "Animal.h"
     
     
    class Mammifere: public Animal{
        protected :
            double duree;
        public :
            Mammifere();
            Mammifere(std::string nom,std::string couleur,std::string cri,double dure);
            virtual void affiche() const;
            void setDuree(double d);
     
    };
    Classe 'Animal' :
    Code : 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
     
    #include <string>
     
    class Animal{
        protected :
            std::string cri,couleur,nom;
        public :
            Animal();
            Animal(std::string nom,std::string couleur,std::string cri);
            virtual void affiche()const ;
            void setCri(std::string cri);
            void setNom(std::string nom);
            void setCouleur(std::string couleur);
     
     
    };

    voila le main :

    Code : 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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include <iostream>
    #include <string>
    #include <vector>
    #include "Animal.h"
    #include <time.h>
    #include "Oiseau.h"
    #include "Mammifere.h"
    
    
    using namespace std;
    
    
    void getAnimal(int choix,Animal* a){
        if(choix<4 && choix>0){
            string nom,cri,couleur;
            do{
                cout<<"Entrez le nom :";
                getline(cin,nom);
            }while(nom.length()==0);
            a->setNom(nom);
            do{
                cout<<"Entrez le cri :";
                getline(cin,cri);
            }while(cri.length()==0);
            a->setCri(cri);
            do{
                cout<<"Entrez la couleur :";
                getline(cin,couleur);
            }while(couleur.length()==0);
            a->setCouleur(couleur);
            switch (choix)
            {
            	case 2:
            	{
            	    double d;
                    do{
                        cout<<"Entrez la durée de sevrage :";
                        cin>>d;
                    }while(d<0);
                    a=0;
                    Mammifere ma(nom,couleur,cri,d);// ligne qui pose probleme !!
                    a=&ma;
                    break;
            	}
                case 3:
                {
                    double l;
                    do{
                        cout<<"Entrez la longueur des ailes :";
                        cin>>l;
                    }while(l<0);
                    a=0;
                    Oiseau o(nom,couleur,cri,l);
                    a=&o;
                    break;
                }
            }
        }
    }
    
    
    void affich(Animal const& a){
        a.affiche();
    }
    
    
    int main()
    {
    
        
        vector<Animal*> Arche;
        int n;
        do{
            cout<<"Entrez le nb d'animaux : ";
            cin>>n;
            }while(n<1);
        for(int i=0;i<n;i++){
            int choix=0;
            do{
                cout<<"ça sera : 1-Animal\n2-Mammifere\n3-Oiseaux"
                <<"\nFaites un choix : ";
                cin>>choix;
            }while(choix<1 || choix>3);
            Arche.push_back(new Animal());
            getAnimal(choix,Arche[i]);
        }
        for(int i=0;i<n;i++){
            affich(*(Arche[i]));
            delete Arche[i];
            Arche[i]=0;
        }
        return 0;
    }

    code d'erreur complet :

    obj\Debug\main.o||In function `Z9getAnimaliP6Animal'


    |44|undefined reference to `Mammifere::Mammifere(std::string, std::string, std::string, double)'|
    obj\Debug\main.o||In function `~Mammifere'
    |7|undefined reference to `vtable for Mammifere'|
    ||=== Build finished: 2 errors, 0 warnings ===|

    donc le probleme reside dans l'appel de la class Mammifere

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    Est-ce que tu as bien ajouté tes différents fichiers à ton projet ?

    EDIT : Finalement, autre question : où est l'implémentation du constructeur de mammifère ?

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Citation Envoyé par Nekkro Voir le message
    Est-ce que tu as bien ajouté tes différents fichiers à ton projet ?

    EDIT : Finalement, autre question : où est l'implémentation du constructeur de mammifère ?
    bah oui ts les fichies sont dans le meme dossier et concernant les .cpp les voila :

    Animal :
    Code : 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
    #include "Animal.h"
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    Animal::Animal():cri(""),couleur(""),nom(""){}
     
    Animal::Animal(string nom,string couleur,string cri){
        this->nom=nom;
        this->couleur=couleur;
        this->cri=cri;
    }
     
     
    void Animal::affiche() const{
    cout<<nom<<"    "<<couleur<<"       "<<cri;
    }
     
    void Animal::setCri(std::string cri){
        this->cri=cri;
    }
     
    void Animal::setNom(std::string nom){
        this->nom=nom;
    }
     
    void Animal::setCouleur(std::string couleur){
        this->couleur=couleur;
    }
    Mammifere :
    Code : 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
    #include "Mammifere.h"
    #include <string>
    #include <iostream>
    #include "Animal.h"
     
    using namespace std;
     
    Mammifere::Mammifere():duree(0){
        Animal::Animal();
    }
     
    Mammifere::Mammifere(string nom,string couleur,string cri,double dure):duree(dure){
        Animal::Animal(nom,couleur,cri);
    }
     
     
    void Mammifere::affiche() const{
    Animal::affiche();
    cout<<"\nDurée : "<<duree;
    }
     
    void Mammifere::setDuree(double d){
        this->duree=d;
    }

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Les constructeurs de Mammifere sont mal écrits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Mammifere::Mammifere()
    : duree(0)
    {
    }
     
    Mammifere::Mammifere(string nom,string couleur,string cri,double dure)
    : Animal(nom,couleur,cri)
    , duree(dure)
    {
    }
    Cordialement.

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    Les constructeurs de Mammifere sont mal écrits:


    Cordialement.
    nn c pas ça l'erreur le constructeur est implementé correctement on peut initialiser un attribut de cette façon !
    Cdt.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    Ce n'est pas parce que le compilateur le permet que c'est forcément la bonne méthode. En écrivant au mieux le code, tu réduis les possibilités de problèmes cachés que tu n'aurais pas remarqué.

    Chose que j'ai vu, dans getAnimal(), tu crées un objet Mammifere ou Oiseau qui n'est pas alloué sur le tas. Ces objets disparaitront donc à la fin de la fonction, et ton pointeur ne pointera plus sur rien.

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Citation Envoyé par Nekkro Voir le message
    Ce n'est pas parce que le compilateur le permet que c'est forcément la bonne méthode. En écrivant au mieux le code, tu réduis les possibilités de problèmes cachés que tu n'aurais pas remarqué.

    Chose que j'ai vu, dans getAnimal(), tu crées un objet Mammifere ou Oiseau qui n'est pas alloué sur le tas. Ces objets disparaitront donc à la fin de la fonction, et ton pointeur ne pointera plus sur rien.
    La question ne se pose pas sur la maniere avec laquelle le constructeur est implementé puisque j'en ai fait de meme avec la classe Oiseau qui est implementée "exactement" comme Mammifereavec les constructeur on peut mettre ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Mammifere::Mammifere(string nom,string couleur,string cri,double dure):duree(dure){
        Animal::Animal(nom,couleur,cri);
    }
    ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Mammifere::Mammifere(string nom,string couleur,string cri,double dure):Animal(nom,couleur,cri),duree(dure){
    }
    ou bien encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Mammifere::Mammifere(string nom,string couleur,string cri,double dure){
        Animal::Animal(nom,couleur,cri);
        duree=dure;
    }
    ça sera pareil c juste qe je debute en c++ c pour ça qu'à chaque fois je mets un implementation differente pour qe je m'en rappelle c tt.

    et en ce qui concerne la methode getAnimal() je pense pas que l'objet va disparaitre puisqu'il y a tjrs un pointeur sur la case memoire en plus aprés methodegetAnimal() dans le main je fais un affichage du contenu du vecteur et ils y sont tjrs mes objects ^^ (cela va de soi que je supprime ts les pointeurs après ça )

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Comme le disent Nekkro et r0d, tes constructeurs sont mal écrits. Certes, ce n'est pas ça qui cause l'erreur que tu as indiquée, mais c'est aussi un problème à retardement qui se manifestera dès que tu auras passé cette étape.
    Une façon de s'en rendre compte serait de supprimer le constructeur par défaut de la classe Animal et des autres classes (ce qui ne serait pas en soi une mauvaise idée). Là tu aurais d'autres erreurs avant celle qui te pose problème actuellement, et qui devraient t'éclaircir.

    Pour revenir à cette erreur en particulier, ce n'est pas une erreur de compilation, mais une erreur de lien. Tu indiques que tous les fichiers sont dans le même dossier. Si tu parles de dossier en terme de filesystem, sache que ça n'a aucune signification pour ton compilateur. Il faut, et selon le compilateur utilisé, la procédure varie, indiquer au compilateur que ces fichiers vont ensemble. Si tu veux plus d'aide, il va falloir nous en dire plus sur les outils que tu utilises (compilateur, IDE...)
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Comme le disent Nekkro et r0d, tes constructeurs sont mal écrits. Certes, ce n'est pas ça qui cause l'erreur que tu as indiquée, mais c'est aussi un problème à retardement qui se manifestera dès que tu auras passé cette étape.
    Une façon de s'en rendre compte serait de supprimer le constructeur par défaut de la classe Animal et des autres classes (ce qui ne serait pas en soi une mauvaise idée). Là tu aurais d'autres erreurs avant celle qui te pose problème actuellement, et qui devraient t'éclaircir.

    Pour revenir à cette erreur en particulier, ce n'est pas une erreur de compilation, mais une erreur de lien. Tu indiques que tous les fichiers sont dans le même dossier. Si tu parles de dossier en terme de filesystem, sache que ça n'a aucune signification pour ton compilateur. Il faut, et selon le compilateur utilisé, la procédure varie, indiquer au compilateur que ces fichiers vont ensemble. Si tu veux plus d'aide, il va falloir nous en dire plus sur les outils que tu utilises (compilateur, IDE...)
    Je suis sur code blocks et j'utilise comme compilateur : GNU GCC

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    Dans ce cas un petit screen de ton workspace à gauche serait le bienvenue.

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    c'est bon j'ai trouvé la source de l'erreur : je n'avais pas coché les cases dans le build "debug" et "release" avant la creation du fichier .h concerné par l'erreur

    Merci en tous cas d'avoir essayé de m'aiguilloner ^^

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

Discussions similaires

  1. Undefined reference to une classe qui n'existe pas
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2013, 11h45
  2. Réponses: 13
    Dernier message: 17/05/2010, 21h28
  3. Réponses: 1
    Dernier message: 19/07/2009, 22h37
  4. undefined reference to `vtable for Graphique'
    Par lilly91 dans le forum Débuter
    Réponses: 11
    Dernier message: 23/06/2009, 17h41
  5. 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