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 actuellement connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 297
    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 297
    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 : 51
    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