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 :

Erreurs de compilation vtable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut Erreurs de compilation vtable
    Bonjour, et deja merci de venir voir a quoi ressemble mon probleme !!

    Je dois faire un programme en C++ pour mon examen, j'ai commencé, mais la je suis calé... Mais dans un de mes fichiers, j ai un soucis lors de la compilation, il me lache ces quelques erreurs :

    Messages d'erreur

    [Link error] undefined reference to 'vtable for Represent'
    [Link error] undefined reference to 'Date:ate()'
    [Link error] undefined reference to 'Spectacle::Spectacle()'
    [Link error] undefined reference to ''vtable for Represent()
    [Link error] undefined reference to 'Date:ate()'
    [Link error] undefined reference to 'Spectacle::Spectacle()'
    Id returned 1 exit status

    (C'est à la compilation de repesent.cpp qu'il m'affiche ces sympathiques petites messages..)

    Voila, je vous avoue que je ne suis pas très doué en C++ non plus

    Je vais vous mettre mon code histoire que ce soit plus comprehensible peut etre...


    D'avance merci à vous tous !! =) (en esperant que ca soitcomprehensible.. :s)

    spectacle.cpp

    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
    #include <iostream> // Required for stream output (cout).
    #include <string>
    #include "spectacle.h"
     
    using namespace std;
     
    int main()
    {
     
      Spectacle* sp = new Spectacle(new string("Castafiore"),new string("Un con"),new string("Une merde"));
     
      sp->print();
     
      sp->setTitre(new string("kaka"));
     
      sp->print();
     
      exit(0);
    }
     
     
    Spectacle::Spectacle(string *_titre, string *_auteur, string *_type) {
      titre = *_titre;
      auteur = *_auteur;
      type = *_type;
    }
     
    Spectacle::Spectacle() {
      titre = *new string("Non défini");
      auteur = *new string("Non défini");
      type = *new string("Non défini");
    }
     
     
    void Spectacle::print()
    {
         cout << "\n";
         cout << "***************************************" << "\n";
         cout << "\tSpectacle :" << "\n";
         cout << "Titre  :\t" << this->getTitre() << "\n";
         cout << "Auteur :\t" << this->getAuteur() << "\n";
         cout << "Type   :\t" << this->getType() << "\n";
         cout << "***************************************" << "\n";
    }
     
    string Spectacle::getTitre() {return titre;}
    string Spectacle::getAuteur() {return auteur;}
    string Spectacle::getType() {return type;}
     
    void Spectacle::setTitre(string *_t) {titre = *_t;}
    void Spectacle::setAuteur(string *_a) {auteur = *_a;}
    void Spectacle::setType(string *_t) {type = *_t;}
    spectacle.h

    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
    using namespace std;
     
    class Spectacle {
     
    	string titre;
    	string auteur;
    	string type;
     
    public:
      Spectacle();
      Spectacle(string *titre,string *auteur,string *type);
     
      virtual string getTitre();
      virtual string getAuteur();
      virtual string getType();
     
      virtual void setTitre(string *_t);
      virtual void setAuteur(string *_a);
      virtual void setType(string *_t);
      virtual void print();
    };
    date.cpp
    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
     
    #include <iostream> // Required for stream output (cout).
    #include <string>
    #include "date.h"
     
    using namespace std;
     
    int main()
    {
     
      Date* dt = new Date(1, 10, 2008, 13, 37);
     
      dt->print();
     
      dt->setJour(1);
     
      dt->print();
     
      exit(0);
    }
     
     
    Date::Date(int _jour, int _mois, int _annee, int _heure, int _minutes) {
      jour = _jour;
      mois = _mois;
      annee = _annee;
      heure = _heure;
      minutes = _minutes;
    }
     
    Date::Date() {
      jour = -1;
      mois = -1;
      annee = -1;
      heure = -1;
      minutes = -1;
    }
     
     
    void Date::print()
    {
         cout << "\n";
         cout << "***************************************" << "\n";
         cout << "\tDate :" << "\n";
         cout << this->toString() << "\n";
         cout << "***************************************" << "\n";
    }
     
    string Date::toString()
    {
     
           char buffer [50];
           string dateStr;
           sprintf(buffer,"%d/%d/%d a %d:%d",this->getJour(),this->getMois(),this->getAnnee(),this->getHeure(),this->getMinutes());       
           return buffer;
    }
     
    int Date::getJour() {return jour;}
    int Date::getMois() {return mois;}
    int Date::getAnnee() {return annee;}
    int Date::getHeure() {return heure;}
    int Date::getMinutes() {return minutes;}
     
    void Date::setJour(int _j) {jour = _j;}
    void Date::setMois(int _m) {mois = _m;}
    void Date::setAnnee(int _a) {annee = _a;}
    void Date::setHeure(int _h) {heure = _h;}
    void Date::setMinutes(int _m) {minutes = _m;}
    date.h
    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
     
    using namespace std;
     
    class Date {
     
    	int jour;
        int mois;
        int annee;
        int heure;
        int minutes;
     
    public:
      Date();
      Date(int jour, int mois, int annee, int heure, int minutes);
     
      virtual int getJour();
      virtual int getMois();
      virtual int getAnnee();
      virtual int getHeure();
      virtual int getMinutes();
      virtual string toString();
     
      virtual void setJour(int _j);
      virtual void setMois(int _m);
      virtual void setAnnee(int _a);
      virtual void setHeure(int _h);
      virtual void setMinutes(int _m);
      virtual void print();
    };
    represent.cpp
    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
     
    #include <iostream> // Required for stream output (cout).
    #include <string>
    #include "represent.h"
     
    using namespace std;
     
    int main()
    {
      Represent* rp = new Represent();
      exit(0);
    }
     
    Represent::Represent() {
      this->dt = new Date();
      this->sp = new Spectacle();                      
    }
     
    void Represent::print()
    {
     
    }
    Represent.h
    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
     
    using namespace std;
    #include "date.h"
    #include "spectacle.h"
     
    class Represent {
     
    	Date* dt;
        Spectacle* sp;
     
    public:
      Represent();
     
      virtual Date* getDate();
      virtual Spectacle* getSpectacle();
     
      virtual void print();
    };

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Balise code.
    Car sans, je n'ai même pas envie de regarder le code
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    l'erreur est à l'édition des liens.
    La compilation de repesent.cpp se passe donc bien je suppose (si c'est les seules erreurs que tu as) et tu obtiens un fichier objet (.o ou .obj ... selon le compilateur - rien à voir avec le concept d'objet du C++ bien sûre ).
    Mais tu dois aussi compiler spectacle.cpp et date.cpp, puis lier les trois fichiers objets que tu as obtenus( par exemple repesent.o, spectacle.o et date.o ) pour en faire une application - un exécutable dans ton cas.

    D'après tes erreurs, tu dois essayer de créer un exécutable qu'avec repesent.o d'où les références manquantes. Pour avoir plus d'aide, il faudrait que tu précises comment tu compiles ton projet ( ligne de commande, makefile, "IDE" : Environnement de Développement Intégré - ce dernier cas m'étonnerait car les IDE gèrent tout seul la compilation et l'édition des liens).

    Au passage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Spectacle::Spectacle(string *_titre, string *_auteur, string *_type) {
      titre = *_titre;
      auteur = *_auteur;
      type = *_type;
    }
    serait peut-être mieux comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Spectacle::Spectacle(const string & _titre, const string & _auteur, const string & _type) {
      titre = _titre;
      auteur = _auteur;
      type = _type;
    }
    comme tu ne modifies pas la chaîne, autant la passer en const et le passage par référence est peut-être un peu plus joli, mais surtout ne permet pas le passage d'un pointeur NULL, qui ferait planter les lignes du typeet ouch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Spectacle::Spectacle() {
      titre = *new string("Non défini");
      auteur = *new string("Non défini");
      type = *new string("Non défini");
    }
    tu crées des variables string dynamiquement par new sans les libérer par un delete -> fuites mémoires ; ceci est déjà plus correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Spectacle::Spectacle() {
      titre = string("Non défini");// ou simplement titre = "Non défini";
      auteur = string("Non défini");
      type = string("Non défini");
    }
    plus dans l'esprit C++ : l'usage de la liste d'initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Spectacle::Spectacle()
    :
      titre("Non défini"),
      auteur("Non défini"),
      type("Non défini"),
    {}
     
    // et de même
    Spectacle::Spectacle(const string & _titre, const string & _auteur, const string & _type) 
    :
      titre(_titre),
      auteur(_auteur),
      type( _type),
    {}

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Rien à voir avec ton problème, mais ton code n'est pas const-correct, tu utilises des new partout alors que ça sert à rien, y'a des fuites dans tous les sens et ça risque pas d'être exception-safe facilement même si tu rajoutes des delete.

  5. #5
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    Citation Envoyé par socra Voir le message
    Bonjour, et deja merci de venir voir a quoi ressemble mon probleme !!

    Je dois faire un programme en C++ pour mon examen, j'ai commencé, mais la je suis calé... Mais dans un de mes fichiers, j ai un soucis lors de la compilation, il me lache ces quelques erreurs :

    Messages d'erreur

    [Link error] undefined reference to 'vtable for Represent'
    [Link error] undefined reference to 'Date:ate()'
    [Link error] undefined reference to 'Spectacle::Spectacle()'
    [Link error] undefined reference to ''vtable for Represent()
    [Link error] undefined reference to 'Date:ate()'
    [Link error] undefined reference to 'Spectacle::Spectacle()'
    Id returned 1 exit status

    (C'est à la compilation de repesent.cpp qu'il m'affiche ces sympathiques petites messages..)
    Salut,
    J'ai eu récemment les même message d'erreurs, j'avais oublié de mettre "=0" à la fin de mes méthodes virtuelles pures. Il semble que tu as fait pareil.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    Merci a tous pour vos réponses, je vais aller essayer tout ca, je vous tiens au courant
    Et en particulier, merci a toi Davidbrcz de m'avoir aimablement fait remarquer qu'il fallait une balise code et de m avoir appris a l utiliser pour mon premier post, et ça toujours sur un ton si agréable, de tout coeur, merci a toi.

  7. #7
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    Comment se fait-il que tu aies une fonction main () dans chaque fichier .cpp?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Apparemment, tu as mal saisi le fonctionnement du linker, et de la compilation séparée en général. C'est ce que semble indiquer la présence des multiples procédures main() dans ton code, et également les erreurs au niveau de la compilation en elle-même.

    Qu'est sensé faire ton code ?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    Il n'est pas fini, mais c'est un censé, au final, etre un prog pour des reservations de places de spectacles (avec differents spectacles, differentes dates, heures, etc).. Ah oui, pour info, j utilise dev-c++.

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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