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 :

Variables globales dans une classe


Sujet :

C++

  1. #1
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut Variables globales dans une classe
    Bonjour,

    Et elle n'est pas banal c'est question :-), elle est ridicule mais là j'ai gros trou de mémoire.

    Actuellement j'ai pas mal de constantes dans mes classes. Cependant elles sont globales et non pas uniquement liées à la classe. Mais en faisant les define dans la classe.
    Comment puis-je utiliser des constantes pour quels ne soit visible que par la classe ou en faisant CClass::Constante ?

    Merci d'avance et encore désolé pour cette question

    Bye


    [Titre modifié par Loulou24, merci d'utiliser des titres explicites]

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    dans le header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class maths
    {
       static const double pi;
    };
    Dans l'implementation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const double maths::pi=3.14159; // oui c'est un peu court.

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut

    voir post pour constantes globales dans une classe ou un namespace

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    petite precision d'ecriture par convention les constantes sont ecrites entierement en majuscules juste un detail mais respecter par beaucoup de developpeurs par soucis de lisibilité

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par star_light
    petite precision d'ecriture par convention les constantes sont ecrites entierement en majuscules juste un detail mais respecter par beaucoup de developpeurs par soucis de lisibilité
    pas toujours, car on peut les confondre avec les macros.
    en particulier, si les constantes sont regroupées dans une classe ou un namespace Constantes (par exemple) il n'y aura pas d'ambiguité avec les variables donc on peut les mettre en minuscules. là où il peut y avoir ambiguité et ou les majuscules ou une autre convention s'impose c'est dans le cas de l'emploi de "extern". dans ce cas la convention employée est le seul moyen de différencier tout de suite les constantes des variables (surtout quand celui qui lit le code n'est pas celui qui l'a écrit).


  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par Gandalf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const double maths::pi=3.14159; // oui c'est un peu court.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const double maths::pi=4*atan(1.0); // là c'est moins court
    // const double maths::pi=2*acos(1.0);
    // ...

  7. #7
    Membre habitué
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Points : 161
    Points
    161
    Par défaut
    Bien d'accord avec toi bigboomshakala, y'a que les macros que je met entièrement en majuscule, mais bon pourquoi pas ? C'est pas interdit...

    D'ailleurs en parlant de macros, y'en a pas une qui s'appelle "M_PI" ?
    Gaïa n'est pas une marchandise.

  8. #8
    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
    J'ai tendance à mettre en majuscules les constantes connues à la compilation, pour les différentier des autres constantes, car ce sont des bêtes différentes (et ça facilite le portage de #define vers const...).
    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.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    La solution classique fournie par Gandalf est un grand classique, elle marche bien et à le mérite de rattacher les constantes à une ou plusieur classes, ce qui évite de trimballer des données 'orphelines'.

    Je suis pour le moins sceptique quand à la proposition de bigboomshakala de définir les constantes dans un namespace. Cette méthode ne permet pas de partager une même donnée entre plusieurs unité de compilation.
    En terme d'édition de lien, un namespace n'a aucune existance. Cela revient à définir des variables globale. Or le seul moyen de partager une variable globale, c'est de préciser au compilateur que le symbole est externe à l'unité de compilation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern const int maConstante;
    La méthode décrite défini les constante dans un ficher d'entête mais ne les déclare pas dans une unité de compilation spécifque. Par conséquent, toute les constantes seront redéfinies dans chaque unité de compilation incluant cet entête.
    En gros, et pour faire clair, si on défini de cette manière une constante PI, chaque fichier source possèdera sa variable globale PI.
    A part la perte de mémoire occasionnée, le reste est transparent puisque toutes ces variables sont initialisées de la même façcon. Ce n'est néanmoins pas une solution recevable.

    Une autre solution couramment employée pour les constantes entières est de les définir par une énumération annonyme. Cette solution à le mérite de supprimer toute édition de lien, puisque le compilateur remplace directement la constante par sa valeur (cf. exmple ci-dessous).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum {VERSION = 2}
     
    struct Cube
    {
      enum {NB_FACE = 6}:
    };
     
    int main()
    {
      cout << VERSION;
      cout << Cube::NB_FACE;
    }

  10. #10
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    remarque : c'est ce que fait Visual pour la définition des ID de ressource pour les classes de dialogue.
    Par contre, j'ai du mal à saisir la nuance entre l'enum anonyme et l'attribut static const... Est-ce juste une différence de lieur ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par tut
    remarque : c'est ce que fait Visual pour la définition des ID de ressource pour les classes de dialogue.
    Par contre, j'ai du mal à saisir la nuance entre l'enum anonyme et l'attribut static const... Est-ce juste une différence de lieur ?
    Un enum n'a pas d'existance dans le code généré. Du point de vue de l'édition de lien, il a grosso modo la valeur d'un #define.
    Alors que lors de l'execution, un static const est stocké en mémoire.

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Un enum ne peut-etre qu'un entier alors qu'un static const peut-etre tu type que l'on veut.

    Quand a mettre les globales dans un namespace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    namespace maths
    {
    const double PI=3.14159;
    };
    c'est comme un enum, les variables const n'ayant pas d'existance en C++ (contrairement au C) il n'y aurra pas de gaspillage de mémoire...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par Gandalf
    c'est comme un enum, les variables const n'ayant pas d'existance en C++ (contrairement au C) il n'y aurra pas de gaspillage de mémoire...
    Alors c'est quelque chose que j'ignore. Tu as une référence la dessus ?
    En tout cas, mon compilateur C++, lui ne l'entends pas de cette oreille. Je peux poster le code de test si tu veux. Si les variable globale const n'avaient pas d'existance, il ne serait pas nécessaire d'initialiser les membres statiques de classe.
    Jusqu'à la preuve du contraire ceci est faux

    EDIT: g++ 3.4.0

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Une reference, tous les tutoriaux et cours de C++ enumerant les differences entre le C et la partie du C++ qui est compatible avec le C...

    mais aussi Le Stroustrup Edition spéciale Francaise p 106


    Cela est n'est bien sur pas le cas si la valeur de la constante n'est pas connue au moment de la compilation (resultat d'une fonction par exemple)

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Mouais, je ne suis pas convaincu, et je doute que cela marche avec autre chose que des types scalaires. Franchement j'ai du mal à comprendre comment cela pourrait être compatible avec des contraintes de compilation séparée.
    Mais, par acquis de conscience, j'ai testé là chose. Mes résultats expérimentaux ne correspondent pas à ce que tu dis.

    Maintenant, si tu as un pointeur sur une doc accessible, je veux bien réviser mon jugement. Mes recherches sur google demeurant infructueuses.

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 013
    Points
    11 013
    Par défaut
    Le Stroustrup VF 3e revu et corrigé par Michel Michaud ou un des précédents ? (ils contiennent divers contre-sens)

    Sinon, un brouillon du comité qui peut traiter de ces détails est le document n1359. Je vous laisse l'éplucher
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    J'attend toujours ta doc Gandalf

Discussions similaires

  1. Gestion de variables globales dans une classe Thread
    Par man84 dans le forum Général Java
    Réponses: 13
    Dernier message: 04/05/2015, 14h19
  2. récuperation variable globale d'une class dans un autre
    Par FATENMRABET dans le forum Débuter avec Java
    Réponses: 31
    Dernier message: 26/09/2013, 16h07
  3. Comment récupérer une variable déclarée GLOBALE dans une classe PHP
    Par Globolite dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 08/03/2013, 13h41
  4. Réponses: 6
    Dernier message: 21/07/2009, 11h37
  5. Variables globales dans une fonction?
    Par Death83 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/07/2006, 01h53

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