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 :

[débutant]Définir constante dans classe


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut [débutant]Définir constante dans classe
    Bonjour à tous,

    Je voudrais savoir comment définir correctement des constantes dans une classe de tel façon que chaque objet de cette classe est cette vealeur constante.

    Je m'explique, je voudrais que l'attribut "Cout" soit une valeur constante de la classe "Noeud".

    Donc j'ai définit la classe suivante dans Noeud.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
    class Noeud
    {
    public :
    //Constructeur
    Noeud(int k);
     
    //Accesseurs
    int get_Num(); 
    bool get_Etat();
     
    //Modificateur
    void set_Etat(bool a); 
     
    void afficher();
     
    protected :
     
    //Attributs d'un Noeud
    const int Num;     //Numéro du Noeud
    static const float Cout;                      //Cout du Noeud
    bool Etat;
    };
    #endif
    et voici l'implémentaton de cette même classe dans "Noeud.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
    Noeud::Noeud(int k)
    {
    Num = k;
    //Description des différents couts
    float Mat_EXC = 20.44;
    float Mat_OXC = 10.78;
    float Site_Noeud = 7.67;  
    Cout = Mat_EXC + Mat_OXC + Site_Noeud;
    }
    //Accesseurs
    int Noeud::get_Num() {return Num;}
    bool Noeud::get_Etat() {return Etat;}
     
    //Modificateur
    //void Noeud::set_Num(int a) {Num = a;}
    void Noeud::set_Etat(bool a) {Etat = a;}
     
    void Noeud::afficher()
    {
    cout << "N[" << Num << "] = " << Etat << endl;
    }
    Comme on peut voir "Cout = Mat_EXC + Mat_OXC + Site_Noeud", et donc l'initialisation de la variable "Cout" se fait lors de la création de l'objet et est définit grâce à l'implémentation dans "Noeud.cpp".

    Est il possible d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float Mat_EXC = 20.44;
    float Mat_OXC = 10.78;
    float Site_Noeud = 7.67;  
    static const float Cout = Mat_EXC + Mat_OXC + Site_Noeud;
    ou quelque chose du genre dans mon fichier "Noeud.h" ou "Noeud".cpp

    Mon problème est que j'ai appris le JAVA avant de me lancer dans le C++ et j'ai donc du mal à saisir le principe d'écriture de classe en C++.

    Merci de pouvoir m'éclairer.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    pour les variables statiques, la définition d'objets statique se fait en dehors de toutes fonctions, insère simplement dans ton .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const float Noeud::Cout = 20.44 + 10.78 + 7.67;
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    OK, merci.

    Donc l'écriture suivante dans mon .cpp est correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float Mat_EXC = 20.44;
    float Mat_OXC = 10.78;
    float Site_Noeud = 7.67;  
    const float Noeud::Cout = Mat_EXC + Mat_OXC + Site_Noeud;
    je veux garder cette écriture car je voudrais pouvoir modifier par la suite seulement Mat_EXC ou Mat_OXC ou Site_Noeud .

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Attention à l'ordre d'initialisation des variables, je ne pense pas qu'il soit défini (à vérifier).

    Tu devrais également déclarer tes 3 variables globales comme constantes, ce serait plus consistant avec le reste.

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu devrais également déclarer tes 3 variables globales comme constantes, ce serait plus consistant avec le reste.
    et surtout ça compilerais (normalement ça passe pas comme ça)

    en plus les variables globales c'est mal, tu devrais plutôt déclarer tes variables comme static const de Noeud en plus ça permet de fixer l'ordre d'initialisation (c'est celui décrit dans la définitione de la classe qui est pris ^^)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    J'ai peur d'avoir mal compris, je débute donc je comprends pas toujours les termes utilisés pour le langage:

    il faut que je définisse dans mon .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static const float Noeud::Mat_EXC = 20.44;
    static const float Noeud::Mat_OXC = 10.78;
    static const float Noeud::Site_Noeud = 7.67;  
    static const float Noeud::Cout = Mat_EXC + Mat_OXC + Site_Noeud;
    Mais à ce moment là, il faut que je modifie dans mon .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Attributs d'un Noeud
    const int Num;     //Numéro du Noeud
    static const float Mat_EXC ;
    static const float Mat_OXC;
    static const float Site_Noeud;
    static const float Cout;   //Cout du Noeud
    bool Etat;
    Ai-je BON?

    Ou il n'est pas nécessaire de modifier mon .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Attributs d'un Noeud
    const int Num;     //Numéro du Noeud
    static const float Cout;   //Cout du Noeud
    bool Etat;

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Il te faut effectivement modifier ton .h comme tu l'as fait
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Très Bien.

    Et bien merci à toi Swoög et à toi aussi Laurent Gomila.

    Ces précisions ne sont pas inutiles pour un débutant comme moi.

    Bonnes continuations.

    Merci Merci Merci!

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    en plus les variables globales c'est mal, tu devrais plutôt déclarer tes variables comme static const de Noeud en plus ça permet de fixer l'ordre d'initialisation (c'est celui décrit dans la définitione de la classe qui est pris ^^)
    Pas forcément, visiblement.

    http://c.developpez.com/faq/cpp/?pag...sco_types_base

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    là ceux sont des variables globales (hors de tout contexte)

    pour les variables contenues dans des classes, l'ordre donnée dans le .h provoquer un ordonancement (exemple, à compiler avec g++ en mode stricte ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class test
    {
       private :
         int a, b;
     
       public :
         test(int _a, _b) : b(_b), a(_b) {}
    };
    normalement il y a un warning comme quoi test::a est spécifié après test::b alors qu'il est initialisé avant
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oui mais là on parle de variables membres statiques.

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Les variables globales (dont les membres statiques) sont initialisees fichier par fichier dans leur ordre de definition dans le fichier (pour les variables qui necessitent une initialisation au run-time, certaines sont initialisees des le chargement; celles qui necessitent une initialisation au run-time sont initialisee au chargement a 0).

    L'ordre d'initialisation entre fichier n'est pas defini.

    L'ordre de destruction est l'ordre inverse de l'ordre d'initialisation.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/01/2008, 19h13
  2. Réponses: 19
    Dernier message: 14/08/2007, 14h41
  3. [Débutant] Utilisation d'une classe dans une servlet
    Par stokoma1981 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 28/09/2006, 15h11
  4. Débutant : Définir une condition dans une zone de texte
    Par OlivierC69 dans le forum Access
    Réponses: 5
    Dernier message: 11/08/2006, 23h02
  5. Réponses: 4
    Dernier message: 08/11/2005, 15h10

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