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 static dans une fonction membre


Sujet :

C++

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut Variable static dans une fonction membre
    Bonjour,

    Je crée une class contenant une fonction membre dans laquelle je déclare une variable static. Maintenant si je déclare un tableau de ma class, je me demande si cette variable static est dupliquée ou si elle n'existe qu'une seul est unique fois.

    Merci de vos lumiére

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    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
    #include <iostream>
     
    class Foo
    {
    public:
    	Foo() {	}
     
    	void Bar()
    	{
    		static int i = 0;
    		std::cout << i++ << std::endl;
    	}
    };
     
    int main(int argc, char **argv)
    {
    	Foo foos[10];
     
    	for (size_t i = 0; i < 10; ++i) {
    		foos[i].Bar();
    	}
    	return 0;
    }
    donne :
    0
    1
    2
    ...

    La réponse semble oui, et c'est tant mieux, c'est le but d'une variable static : garantir l'unicité de cette variable.
    --
    Jérémie

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Points : 593
    Points
    593
    Par défaut
    jfouche : Pourquoi size_t pour parcourir le tableau ?

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Car c'est le type le plus approprié : c'est un type correspondant à une taille, ce qui est exactement ce que je veux pour parcourir un tableau. on peut aussi utiliser unsigned (short / int / long) qui représente un entier positif. Utiliser un int est moins bon car il peut être négatif, ce qui ne veux rien dire pour l'index d'un élément dans un tableau.
    En somme : utiliser systématiquement le type dont la sémantique correspond à ce que je souhaite. C'est une bonne habitude à prendre que de donner des interfaces correctes.
    --
    Jérémie

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Pour revenir à la variable locale static : On peut voir ça comme une variable membre static dont la portée est locale à la méthode où elle est déclarée.

    De même qu'une variable membre static peut être vu comme une variable globale dont la visibilité est limitée à la classe où elle est déclarée. Attention, à mes yeux, les variables globales sont à limiter au maximum (entendre :à prohiber sauf cas exceptionnel).

    Est ce plus clair ?
    --
    Jérémie

  6. #6
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Merci beaucoup,
    C'est éffectivement trés clair et vue le comportement à visiblement utiliser avec vraiment beaucoup de procausions si ce n'est le plus rarement possible

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

    Informations professionnelles :
    Activité : aucun

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

    Effectivement, une variable statique déclarée dans une fonction membre sera unique quel que soit le nombre d'instances ou le nombre d'appel de la fonction effectué.

    En terme de conception, on parle d'ailleurs de membre ou de fonction "de classe" par opposition à un membre ou à une fonction "d'instance".

    Le seul cas pour lequel je voies un avantage à la déclaration d'une variable statique au sein d'une fonction pourrait être la création d'une forme particulière de singleton:
    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 MySingletonClass
    {
        public:
            static MySingletonClass& instance()
            {
                /* inst sera unique pour toutes les invocations de instance()
                 * et sera donc créée à la première invocation de celle-ci
                 */
                static MySingletonClass inst;
                return inst;
            }
            /* les fonctions (non statiques) intéressantes */
        private:
            /* le constructeur ne doit être accessible qu'au départ de
             * instance (ne pas oublier de le définir)
             */
           MySingletonClass(){}
           /* le constructeur par copie et l'opérateur d'affectation sont
            * déclarés private et ne sont pas définis (ce qui rend la classe
            * non copiable et non assignable)
            */
           MySingletonClass(MySingletonClass const &);
           MySingletonClass& operator=(MySingletonClass const & );
    };
    La fonction statique instance() étant appelable sans avoir recours à une instance de la classe (encore heureux, vu qu'elle permet, justement... d'obtenir une instance de la classe ), cette classe sera utilisée sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MySingletonClass::instance().fonctionPublique1();
    MySingletonClass::instance().fonctionPublique2(/*parametres éventuels */);
    /* voire, si les fonctions publiques renvoient une référence sur 
     *l'instance en cours 
     */
    MySingletonClass::instance().
                      fonction.publique3().
                      fonctionPublique3().
                      fonctionPublique4();
    Dans tous les autres cas, il faut vraiment se poser la question de savoir s'il est intéressant que chaque invocation de la fonction partage la même variable, et la réponse est, bien souvent, non

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Points : 593
    Points
    593
    Par défaut
    Y a quelques temps j'ai implémenté un singleton avec cette technique, tu n'aurais pas oublié de faire de inst une variable static !?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par Ubiquité Voir le message
    Y a quelques temps j'ai implémenté un singleton avec cette technique, tu n'aurais pas oublié de faire de inst une variable static !?
    Ouppss... oui, bien sur... j'étais quelque peu distrait

    Je modifie le code

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/06/2006, 13h48
  2. [PHP-JS] une variable php dans une fonction javascript
    Par megapacman dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2006, 14h08
  3. [PHP-JS] une variable php dans une fonction javascript
    Par megapacman dans le forum Langage
    Réponses: 3
    Dernier message: 12/06/2006, 14h02
  4. [PHP-JS] Renseigner une variable php dans une fonction JS
    Par gwen-al dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 14/04/2006, 08h31
  5. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58

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