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 :

Undefined reference to `appel au constructeur d'un objet` [Débutant(e)]


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Undefined reference to `appel au constructeur d'un objet`
    Bonjour,
    Je me suis mis au C++ deux jours et je rencontre une difficulté plutôt frustrante:
    J'ai trois fichiers: main.cpp Mot.cpp Mot.hpp. Voici le code:
    main.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
     
    #include <fstream>
    #include "Mot.hpp"
    #include <string>
    using namespace std;
     
    int main()
    {
        cout << "Saisir un mot :" << endl;
        string chaine;
        cin >> chaine;
        Mot mot;
        mot.setChaine(chaine);
        mot.melanger();
        cout << "Les lettres sont : " << mot.getMelange() << endl;
        cout << "Proposition : " << endl;
        cin >> chaine;
        if(chaine.compare(mot.getChaine()) == 0) cout << "OK !" << endl;
        else cout << "Non !" << endl;
        return 0;
    }
    Mot.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
     
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include "Mot.hpp"
    using namespace std;
     
    class Mot
    {
        private:
            string chaine;
            string melange;
        public:
            Mot()
            {
            }
            Mot(string _chaine)
            {
                chaine = _chaine;
            }
            void melanger()
            {
                unsigned short int i(0),j;
                while(i < chaine.length())
                {
                    j = (rand()*(chaine.length()));
                    melange[j] = chaine[i];
                    i++;
                }
            }
            string getMelange()
            {
                return melange;
            }
            string getChaine()
            {
                return chaine;
            }
            void setChaine(string _chaine)
            {
                chaine = _chaine;
            }
            virtual ~Mot()
            {
     
            }
    }
    Mot.hpp :
    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
     
    #ifndef MOT_HPP_INCLUDED
    #define MOT_HPP_INCLUDED
     
    #include <string>
    using namespace std;
    class Mot
    {
        public:
            Mot();
            Mot(string _chaine);
            void melanger();
            string getMelange();
            void setChaine(string _chaine);
            string getChaine();
            virtual ~Mot();
    };
     
    #endif // MOT_HPP_INCLUDED
    A la ligne 12 dans main.cpp j'obtiens l'erreur suivante: undefined reference to Mot::Mot()
    Dans les différents tutoriels que j'ai consulté, la manière de créer un objet semble être identique, et je ne vois pas d'erreur dans les fichiers Mot.cpp et Mot.hpp. Peut-être une étourderie de ma part ?

    Je vous remercie d'avance pour toute réponse.

    Ben

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,

    Pourquoi ne pas appeler le fichier "Mot.hpp" "Mot.h" comme d'habitude ( Je trouve ça étrange )?
    Il faut aussi éviter les using namespace dans les fichiers de déclaration

  3. #3
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Pourquoi ne pas appeler le fichier "Mot.hpp" "Mot.h" comme d'habitude ( Je trouve ça étrange )?
    Tu peux mettre n'importe quelle extension que ton compilo gerera, .h, .hpp, .hxx etc. Rien n'est forcé. Tout Boost est fait avec des .hpp d'ailleurs.


    Il faut aussi éviter les using namespace dans les fichiers de déclaration
    Oui, il faut surtout ne jamais mettre de using namespace dans les headers/fichiers d'entete.



    Sinon le problème est que tu déclares ta classe dans le header mais dans le CPP tu ...déclares encore la classe mais avec les définitions. Ce que tu dois avoir dans le cpp c'est ça :

    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
     
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include "Mot.hpp"
    using namespace std;
     
     
            Mot::Mot()
            {
            }
     
            Mot::Mot(string _chaine)
            {
                chaine = _chaine;
            }
     
            void Mot::melanger()
            {
                unsigned short int i(0),j;
                while(i < chaine.length())
                {
                    j = (rand()*(chaine.length()));
                    melange[j] = chaine[i];
                    i++;
                }
            }
     
            string Mot::getMelange()
            {
                return melange;
            }
     
            string Mot::getChaine()
            {
                return chaine;
            }
     
            void Mot::setChaine(string _chaine)
            {
                chaine = _chaine;
            }
     
            Mot::~Mot() // virtual n'est valide que dans la déclaration, pas la definition
            {
     
            }
    Une fois cela fait, les fonctions seront donc compilé et le linker pourra faire le lien entre l'appel au constructeur sur la ligne avec l'erreur et l'implémentation du constructeur tel que je viens de l'écrire.

    Je me trompe si je pense que tu viens de langages "managé"?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par bertry Voir le message
    Pourquoi ne pas appeler le fichier "Mot.hpp" "Mot.h" comme d'habitude ( Je trouve ça étrange ) ?
    Et pourquoi ne pas appeler Mot.cpp en Mot.c ?

  5. #5
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par oodini Voir le message
    Et pourquoi ne pas appeler Mot.cpp en Mot.c ?
    Attention, il y a un piège

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos réponses.
    J'ai modifié mes fichiers comme Klaim me l'a indiqué:
    Mot.hpp :
    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
     
    #ifndef MOT_HPP_INCLUDED
    #define MOT_HPP_INCLUDED
     
    #include <string>
    class Mot
    {
        public:
            Mot();
            Mot(std::string _chaine);
            void melanger();
            std::string getMelange();
            void setChaine(std::string _chaine);
            std::string getChaine();
            virtual ~Mot();
    };
     
    #endif // MOT_HPP_INCLUDED
    Mot.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
     
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include "Mot.hpp"
    using namespace std;
     
        private:
            string chaine;
            string melange;
        public:
            Mot::Mot()
            {
            }
            Mot::Mot(string _chaine)
            {
                chaine = _chaine;
            }
            Mot::void melanger()
            {
                unsigned short int i(0),j;
                while(i < chaine.length())
                {
                    j = (rand()*(chaine.length()));
                    melange[j] = chaine[i];
                    i++;
                }
            }
            Mot::string getMelange()
            {
                return melange;
            }
            Mot::string getChaine()
            {
                return chaine;
            }
            Mot::void setChaine(string _chaine)
            {
                chaine = _chaine;
            }
            Mot::virtual ~Mot()
            {
     
            }
    Mais j'ai toujours l'erreur: undefined refence to Mot:Mot()

    Klaim:
    Je me trompe si je pense que tu viens de langages "managé"?
    Si langage managé veut dire Java ou PHP, oui tu as raison.
    Merci pour tes indications.

    Ben

  7. #7
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private:
            string chaine;
            string melange;
        public:
    Ca n'a rien a faire là.

    Lis bien mon exemple : je ne fais que définir le contenu de chaque fonction déclarée dans la classe, avec une syntaxe MaClasse::MaFonctionMembre() qui permet au compilo de savoir que c'est une fonction membre d'une classe.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Un grand merci, ça fonctionne.
    Désolé pour mon inattention.

    Ben

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

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. Faire appel à un constructeur d'un objet
    Par ploxien dans le forum Langage
    Réponses: 8
    Dernier message: 03/05/2007, 10h32
  3. [héritage privé] appel du constructeur de base
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 4
    Dernier message: 19/10/2004, 14h05
  4. undefined reference to `xmlParseFile'
    Par Clemaster dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 25/06/2004, 20h38
  5. g++ : undefined reference to ...
    Par le_barbu dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 14/05/2004, 07h23

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