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 :

Création de classe et compilation


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut Création de classe et compilation
    Bonjour à tous,

    Me mettant au C++ de base, je souhaite créer une classe, des fonctions membres et un main().

    Il me semblait avoir tout fait proprement, mais à la compilation les fonctions membres ne sont reconnus :
    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
     
    ________________
    Voici le .h (maclasse.h)
     
    #ifndef MACLASSE_H
    #define MACLASSE_H
     
    using namespace std;
     
    class maClasse{
     
     public:
      maClasse();
      ~maClasse();
     
      string nom;
      int nombre;
      void fonction( string mode );
     
    };
    #endif
     
    ______________
    Voici le .cc (maClasse.cc)
     
    #include "maClasse.h"
     
    maClasse::maClassel(){
     nom = "toto";
     nombre = 1;
    }
    maClasse::~maClassel(){}
     
    void maClasse::fonction( string mode ){
     
    cout <<"je ne fais rien" << endl;
     
    }
     
     
     
    ______________
    Voici le main (M_maClasse.cc)
     
    #include "maClasse.h"
    using namespace std;
     
    int main( string mode ){
       maClasse C;
      C.fonction( mode );
      return 0;
    }
     
     
    __________________
     
    Rien de très compliqué vous voyez.
     
    Mais à la compilation les constructeurs et destructeurs appelés lors de la création de maClasse ne sont reconnus :
     
    undefined reference to `maClasse::maClasse()'
    undefined reference to `maClasse::~maClasse()'
    Est ce que vous voyez la faille ?

    Merci,

    Xavier

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    1. On ne met pas de using namespace dans un fichier d'en-tête.
    2. Ton erreur est une erreur d'édition de liens. Peux-tu nous montrer tes commandes de compilation et d'édition de liens ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    dans le .cc, tes noms de fonction (consttructeur+desctructeur) ne sont pas exactement les meme que dans le .h



    maClassel != maClasse

  4. #4
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Citation Envoyé par Médinoc
    On ne met pas de using namespace dans un fichier d'en-tête.
    Ca doit etre correct mais je me demande bien pourquoi ?

  5. #5
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut
    Effectivement il y a une coquille, mais c'est en recopiant que je me suis trompé, ce n'est donc pas à l'origine de l'erreur.

    Pour la compilation j'utilise le logiciel ROOT du cern :

    .L M_maClasse.cc++

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par ZaaN
    Ca doit etre correct mais je me demande bien pourquoi ?
    Parce que cela annihile la fonction des namespaces : Éviter les conflits.

    En mettant un using namespace dans ton fichier d'en-tête, tu forces l'emploi du namespace correpondant à quiquonque incluera ton fichier d'en-tête dans son fichier source.

    Et si dans ce fichier source il y a une classe portant le même nom qu'une classe du namespace std (par exemple : list), il y aura conflit.

    Par conséquent, l'auteur du fichier d'en-tête n'a pas à choisir quels namespaces il veut en "using". C'est à celui qui inclut le fichier de faire ce choix.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    donc si t'as 1000 object de type std::vector dans un .h et que tu veux rester propre, tu n'as d'autre choix que tous les prefixé avec le "std::" ? ou alors y a une astuce ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ZaaN
    donc si t'as 1000 object de type std::vector dans un .h et que tu veux rester propre, tu n'as d'autre choix que tous les prefixé avec le "std::" ? ou alors y a une astuce ?
    et les typedefs ?
    mais personnellement, cela ne me dérange pas de garder le std:: dedant, car on gagne en lisibilité

Discussions similaires

  1. [RMI] problème Création *_stub.class et *_skel.class
    Par philobedo dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 29/05/2006, 20h03
  2. Contrôler l'ordre de création de classes globales
    Par 10_GOTO_10 dans le forum C++
    Réponses: 4
    Dernier message: 24/04/2006, 20h39
  3. Création de classe exception
    Par HNT dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 03/01/2006, 15h53
  4. Création de classes à la volée...
    Par ouiffi dans le forum Langage
    Réponses: 8
    Dernier message: 16/12/2005, 18h01

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