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 :

Gérer des constantes


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut Gérer des constantes
    J'ai besoin de constantes dans un programme, et j'aimerais avoir pour une fois quelque chose de plus propre que des const déclaré dans un coin, et en extern partout ailleurs....

    Quelle technique utiliser pour faire cela bien?

    Est-il possible par exemple de créer une classe Constante:: contenant toutes ces constantes et accessible de tout le programme?
    Est-ce qu'il est obligatoire d'instancier cette classe pour l'utiliser ou peux on accéder aux attribut de nimporte ou en fesant simplement Constante::MaxTaille ??

    Merci pour vos conseils!

  2. #2
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    Tu peux utiliser un namespace

    http://c.developpez.com/faq/cpp/?page=namespace

    XXiemeciel
    XXiemeciel

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Hum, regarde du coté des singletons ( je n'ai pas de lien sous la main, mais google fera l'affaire ) .

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Est-ce qu'il est obligatoire d'instancier cette classe pour l'utiliser ou peux on accéder aux attribut de nimporte ou en fesant simplement Constante::MaxTaille ??
    Il faut pour cela utiliser des champs static

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    J'ai essayé avec les champs statics comme dans la FAQ mais ca refuse de linker quand j'appel directement Constante::maconstante

    Je me rends pas compte de se que ca donne avec les namespace faut que je test ca!

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    J'ai essayé avec les champs statics comme dans la FAQ mais ca refuse de linker quand j'appel directement Constante::maconstante
    Oulà, envoie ton code parce que ce n'est pas très normal tout ça (en plus une erreur de linker ...)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Autant pour moi ca marche parfaitement j'avais du trop boire de ricard...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef __Constantes_h__
    #define __Constantes_h__
     
    class Constantes{
    public:
    	static const double TOL;
    };
     
    const double Constantes::TOL = 0.00000001;
     
     
    #endif //__Constantes_h__

    J'aime bien cette approche vu qu'elle marche Avez vous des idées sur les avantages/inconveignants par la rapport a un namespace?

  8. #8
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Salut,
    Pourquoi utiliser un classe avec seulement des donnée static?
    j'aurai plutot tendance a utilier un namespace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // un fichier mes_constante.h
    #ifndef _MES_CONSTANTES_H_
    #define _MES_CONSTANTES_H_
     
    namespace MesConstantes
    {
        const int              UN_INT = 1;
        const std::string      UN_STRING = "toto";
    ...
    }
    #endif
    puis dans le code tu y accede
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MesConstantes::UN_INT /* par exemple */

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par oldfox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef __Constantes_h__
    #define __Constantes_h__
     
    class Constantes{
    public:
    	static const double TOL;
    };
     
    const double Constantes::TOL = 0.00000001;
     
     
    #endif //__Constantes_h__

    J'aime bien cette approche vu qu'elle marche
    Bin, non, telle qu'écrite, elle ne marche pas...
    La définition de la constante doit se trouver dans un fichier .cpp, et non pas dans un .h. Comme toujours, le principe est le même : On peut avoir plusieurs déclarations, mais une seule définition.

    Citation Envoyé par oldfox
    Avez vous des idées sur les avantages/inconveignants par la rapport a un namespace?
    Le but dans les deux cas est de classer la constante (d'ailleurs, nommer ça constante n'a pas grand intérêt, car ça ne classe rien. Par contre, les séparer en ConstantePhysiques, TauxDeChangeVersEuro... a de l'intérêt).

    L'utilisation d'un namespace offre l'avantage d'être extensible. Si dans un autre fichier, tu dois définir une autre constante qui appartient au même groupe logique que celles déjà défini, tu peux réouvrir le namespace. En outre, avec les jeu des using, tu peux éviter localement de spécifier le nom complètement qualifié quand tu doit dans un endroit traiter beaucoups de constantes de la même catégorie.

    L'utilisation de classe pour ça en C++ est une relique de l'époque où il n'y avait pas de namespace. D'autre langages utilisent une classe car il leur manque la possibilité de définir une constante autrement.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    L'utilisation d'un namespace offre l'avantage d'être extensible. Si dans un autre fichier, tu dois définir une autre constante qui appartient au même groupe logique que celles déjà défini, tu peux réouvrir le namespace. En outre, avec les jeu des using, tu peux éviter localement de spécifier le nom complètement qualifié quand tu doit dans un endroit traiter beaucoups de constantes de la même catégorie.

    L'utilisation de classe pour ça en C++ est une relique de l'époque où il n'y avait pas de namespace. D'autre langages utilisent une classe car il leur manque la possibilité de définir une constante autrement.
    +1

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par JolyLoic
    Bin, non, telle qu'écrite, elle ne marche pas...
    La définition de la constante doit se trouver dans un fichier .cpp, et non pas dans un .h. Comme toujours, le principe est le même : On peut avoir plusieurs déclarations, mais une seule définition.
    Sisi ca marchait J'ai mis dans un .cpp depuis.


    Bon je vais faire ca sous forme de namespace ca a l'air plus simple en effet. Merci

  12. #12
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Bon je vais faire ca sous forme de namespace ca a l'air plus simple en effet.
    je dirais plus adapté

    (pense a un petit résolu si c'est bon )

    Ciao

    Ben

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    C'était pas vraiment un probleme: juste une question ouverte

  14. #14
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Personnelement je pense que pour un projet objet (un projet c++ en fait parti), l'utilisation de variables globales et donc de constantes de namespace n'est pas trés pertinent.

    A mon avis, quasiment tout le temps, une constante peut être vu comme faisant partit des caractéristiques d'une certaine classe d'objet. Et donc elle peut être définit comme variable de classe.

    En c++ cela donne une variable static const.

    Bon c'est sur, certains diront que cela ne changera pas grand chose,.
    Cependant dans le vision Objet du projet c'est quand même plus "propre" ().

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Dans ce cas précis ce sont des classes pour du calcul mathématique (donc vecteurs, matrices etc...), qui doivent donc partager certaines constantes. Je sais pas trop comment organiser ca autrement pour k'il n'y ai besoin ke de mettre la constante a un seul endroit.

  16. #16
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    C'est quoi par exemple la/les constantes et la/les classes mises en jeu?

  17. #17
    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
    Citation Envoyé par oldfox
    Citation Envoyé par JolyLoic
    Bin, non, telle qu'écrite, elle ne marche pas...
    La définition de la constante doit se trouver dans un fichier .cpp, et non pas dans un .h. Comme toujours, le principe est le même : On peut avoir plusieurs déclarations, mais une seule définition.
    Sisi ca marchait J'ai mis dans un .cpp depuis.
    Ce que tu as fait n'est pas clair pour moi. Si tu inclus ton entête tel quel dans plus d'un cpp, tu vas avoir des problèmes.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  18. #18
    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
    Citation Envoyé par JolyLoic
    L'utilisation de classe pour ça en C++ est une relique de l'époque où il n'y avait pas de namespace. D'autre langages utilisent une classe car il leur manque la possibilité de définir une constante autrement.
    Je connais trois intérêts à faire une classe avec uniquement des membres statiques plutôt qu'un namespace:
    • une classe est fermée, donc on est sûr de ce qu'il y a dedans
    • une classe peut être un paramètre template
    • une classe peut être un template
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  19. #19
    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
    Citation Envoyé par MatRem
    Personnelement je pense que pour un projet objet (un projet c++ en fait parti), l'utilisation de variables globales et donc de constantes de namespace n'est pas trés pertinent.
    Un des intérêt du C++, c'est qu'il n'oblige pas à être objet (en admettant qu'on soit d'accord sur ce qu'on appelle être objet, ce dont je ne suis pas sûr). Faire comme en Effeil et hériter d'une classe pour pouvoir utiliser sin et cos me semble être extrêmement artificiel et relever de la technique "si le seul outil qu'on a est un marteau, on n'utilise que des clous". C++ a d'autres outils de structuration que la classe, pourquoi refuser de les utiliser?

    A mon avis, quasiment tout le temps, une constante peut être vu comme faisant partit des caractéristiques d'une certaine classe d'objet. Et donc elle peut être définit comme variable de classe.

    En c++ cela donne une variable static const.

    Bon c'est sur, certains diront que cela ne changera pas grand chose,.
    Cependant dans le vision Objet du projet c'est quand même plus "propre" ().
    Il faudrait que tu donnes d'autres raisons que "ca ne correspond pas à ma vision d'Objet" pour me convaincre.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  20. #20
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Citation Envoyé par JolyLoic
    L'utilisation de classe pour ça en C++ est une relique de l'époque où il n'y avait pas de namespace. D'autre langages utilisent une classe car il leur manque la possibilité de définir une constante autrement.
    Je connait trois intérêts à faire une classe avec uniquement des membres statiques plutôt qu'un namespace:
    • une classe est fermée, donc on est sûr de ce qu'il y a dedans
    • une classe peut être un paramètre template
    • une classe peut être un template
    Je suis d'accord avec ta vision, j'ai parlé trop vite.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Réponses: 12
    Dernier message: 05/10/2011, 15h53
  2. Comment (si possible) gérer des dll en Asm?
    Par @drien dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 06/01/2004, 15h59
  3. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07
  4. Gestion des constantes
    Par valfredr dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/06/2003, 16h23
  5. Au sujet des constantes
    Par FranT dans le forum Langage
    Réponses: 8
    Dernier message: 09/08/2002, 11h03

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