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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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