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 :

Variable globale statique ne l'est pas


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Variable globale statique ne l'est pas
    Salut, mon projet actuel est composé de plusieurs fichiers source (.hpp et .cpp), et il se trouve que j'ai besoin d'une variable contenant le résultat d'un calcul assez lent à faire, donc pour éviter d'avoir à recalculer plusieurs fois, je préfère utiliser une variable globale. Cependant je n'ai besoin que de cette variable globale uniquement dans un seul fichier (.hpp dans mon cas), donc je la mets static pour qu'elle ne soit disponible que dans ce fichier. Or je constate que cette variable est disponible partout dans mon projet... Pourquoi ? Merci de votre aide.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Abdelite Voir le message
    Salut, mon projet actuel est composé de plusieurs fichiers source (.hpp et .cpp), et il se trouve que j'ai besoin d'une variable contenant le résultat d'un calcul assez lent à faire, donc pour éviter d'avoir à recalculer plusieurs fois, je préfère utiliser une variable globale. Cependant je n'ai besoin que de cette variable globale uniquement dans un seul fichier (.hpp dans mon cas), donc je la mets static pour qu'elle ne soit disponible que dans ce fichier. Or je constate que cette variable est disponible partout dans mon projet... Pourquoi ? Merci de votre aide.
    Une variable globale statique n'est pas disponible uniquement dans le fichier où elle est déclaré mais dans toute l'unité de compilation où elle est déclarée.

    Ainsi si tu la déclares dans un header qui est lui même inclus dans un fichier source, elle sera disponible dans ce fichier source.

    Si tu inclus ce même header dans plusieurs fichiers sources, une variable, portant le même nom, sera disponible dans chacun des fichiers sources. Par contre il s'agira bien de variables différentes.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 624
    Points : 30 667
    Points
    30 667
    Par défaut
    Salut,

    A vrai dire, je ne vois pas pourquoi avoir opté pour la variable globale statique:

    Si tu veux partager cette variable avec l'ensemble des instances d'une classe, utilise une variable de classe (un membre static dans la classe)

    Si tu veux partager cette variable uniquement entre différents appels d'une fonction, fais en une variable statique... dans la fonction qui t'intéresse.

    Si enfin, ta variable doit être partagée par les différentes instances d'une classe, mais qu'elle doit être accessible par ailleurs, rajoute une fonction statique à ta classe qui renvoie une référence (éventuellement constante) sur cette variable.

    Si tu n'es dans aucune de ces situation, crée ta variable dans une fonction, effectue les calculs nécessaires, et transmet la variable par référence (éventuellement constante) aux fonctions qui en ont besoin.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Invité
    Invité(e)
    Par défaut
    Si tu veux partager cette variable avec l'ensemble des instances d'une classe, utilise une variable de classe (un membre static dans la classe)
    Je vais opter pour cette solution, mais comment dois-je procéder ? J'ai essayer ce code "type" mais il ne marche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // A.hpp
    class A : public B
    {
    public:
    static const double var;
    };
     
    const double A::var = 1+1;

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Si on fait abstraction de l'héritage de B, le code marche parfaitement.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Si on fait abstraction de l'héritage de B
    Qu'est ce que tu veux dire par là ?

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Que ceci marche:

    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
     
    #include <iostream>
     
    class A
    {
    public:
    static const double var;
    };
     
    const double A::var = 1+1;
     
    int main(int argc, char const *argv[])
    {
        std::cout<<A::var<<std::endl;
        return 0;
    }
    Attention, il faut bien veilleur à mettre l'instruction const double A::var = 1+1; dans un fichier cpp et non un .h

    Tu as quelles erreurs ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Attention, il faut bien veilleur à mettre l'instruction const double A::var = 1+1; dans un fichier cpp et non un .h
    Voilà ou étais mon problème, je ne comprenais pas pourquoi ce "multiple definition...", merci.
    Cependant, j'utilise ma variable static dans une classe héritant d'une autre, est visiblement ça n'a pas l'air de poser problème... Qu'en penses-tu ?

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

Discussions similaires

  1. 2 Variables globales une fonction c'est possible ?
    Par torquemada dans le forum Débuter
    Réponses: 2
    Dernier message: 01/06/2013, 11h33
  2. Réponses: 5
    Dernier message: 07/07/2011, 11h11
  3. variable globale dont je n'arrive pas à visualiser le contenu
    Par wiama dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 18/05/2010, 19h07
  4. Une variable Public qui ne l'est pas
    Par Claude_Azoulai dans le forum ASP.NET
    Réponses: 9
    Dernier message: 18/11/2007, 09h38
  5. Réponses: 22
    Dernier message: 23/11/2006, 23h42

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