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 :

Donnée "static" dans une fonction non "static" accessible à une seule instance


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Donnée "static" dans une fonction non "static" accessible à une seule instance
    Salut!

    Lorsque on écrit:
    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
    class A{
    public:
           int n;
           A(int m):n(m){}
           void f(){
                static int i=0;
                std::cout<<"Instance : "<<n<<" , i vaut : "<<i<<std::endl;
                i++;
                }
    };
     
    int main(void)
    {
    A a1(1),a2(2);
    a1.f();
    a2.f();
    les 2 instances de la classe A, a1 et a2, ont accés à la même donnée static "i" qui est pourtant dans une méthode qui est propre à chaque instance.
    "i" est "static" par rapport à la classe et à le même comportement que dans le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A{
    public:
           static int i;
           int n;
           A(int m):n(m){}
           void f(){
                std::cout<<"Instance : "<<n<<" , i vaut : "<<i<<std::endl;
                i++;
                }
    };
    int A::i=0;

    Donc 2 questions:
    1)Pourquoi les concepteurs du langage ont ils implémenté ce comportement qui peut sembler paradoxal : un comportement "static" dans une méthode propre à chaque instance?
    2)Comment faire alors pour avoir 2 instances d'une classe qui accèdent à une donnée "static" par rapport à une méthode, mais pas par rapport à la classe, chaque instance ayant sa propre donnée "static"?

    Merci de vos réponses.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  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
    je ne suis pas sûr d'avoir bien compris ce que tu entends par static par rapport à une méthode...

    si j'ai bien compris ce que tu veux dire, je te proposerais d'utiliser une donnée membre...

    ensuite, pourquoi ce comportement est possible, c'est certainement parce qu'il permet certains comportements avancés qui peuvent être utiles dans des cas particuliers
    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
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pas mieux, le statique que tu veux, c'est une donnée membre.
    Et les 2 versions de ton static sont quand même bien différentes

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    si j'ai bien compris ce que tu veux dire, je te proposerais d'utiliser une donnée membre...
    Ce n'est pas un problème concret.
    Il est donc impossible d'avoir une variable "static" qui soit spécifique à chaque instance dans une méthode?
    Et les 2 versions de ton static sont quand même bien différentes
    C'était justement pour mettre en évidence un comportement similaire dans deux cas trés différents.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  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 seriousme
    Ce n'est pas un problème concret.
    Il est donc impossible d'avoir une variable "static" qui soit spécifique à chaque instance dans une méthode?
    si ça s'appelle une donnée membre d'une instance...
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par Swoög
    si ça s'appelle une donnée membre d'une instance...
    Une donnée membre d'une INSTANCE de classe ne peut être statique. Si elle l'est, c'est une donnée membre de CLASSE

  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
    Citation Envoyé par ep31
    Une donnée membre d'une INSTANCE de classe ne peut être statique. Si elle l'est, c'est une donnée membre de CLASSE
    de lire le topic en entier AVANT de répondre !

    ça t'évitera de répondre à côté la prochaine fois...
    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 expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    si ça s'appelle une donnée membre d'une instance...
    Je veux dire sous la forme donnée "static" d'une fonction non menbre d'une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f(){
         static int i=0;
         std::cout<<i<<std::endl;
         i++;
         }
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    1)Pourquoi les concepteurs du langage ont ils implémenté ce comportement qui peut sembler paradoxal : un comportement "static" dans une méthode propre à chaque instance?
    Car à la base, static et extern étaient utilisés en C. Il n'y avait pas de notion de classe

  10. #10
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par ep31
    Une donnée membre d'une INSTANCE de classe ne peut être statique. Si elle l'est, c'est une donnée membre de CLASSE


    Oui, mais ce que demande seriousme (si j'ai bien compris), c'est s'il existe des données "statiques" de fonctions membres d'une instance de classe, mais qui ne soient pas partagées entre les différentes instances de la classe.

    Et a priori, le seul élément qui s'en rapproche, c'est la donnée membre d'une instance de classe.

    La différence par rapport à ce que demande seriousme, c'est que la donnée membre de classe n'est pas liée à une fonction membre (elle est partagée par toutes les fonctions membres).

    Du moins, c'est ce que j'ai cru comprendre de ce topic

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par Swoög
    de lire le topic en entier AVANT de répondre !

    ça t'évitera de répondre à côté la prochaine fois...
    Autant pour moi

  12. #12
    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
    tu confonds beaucoup de chose...

    soit ta variable est propre à la classe : static
    soit elle est propre à l'instance : donnée membre
    ou alors elle est locale.

    ensuite, si tu es hors d'une classe, c'est un autre problème.
    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)

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par Swoög
    tu confonds beaucoup de chose...

    soit ta variable est propre à la classe : static
    soit elle est propre à l'instance : donnée membre
    ou alors elle est locale.

    ensuite, si tu es hors d'une classe, c'est un autre problème.
    Merci pour ces trivialités mais je les connaissais

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans tous ces posts, je n'en ai vu qu'un seul qui ait répondu à la question, c'est celui-ci:
    Citation Envoyé par ep31
    Car à la base, static et extern étaient utilisés en C. Il n'y avait pas de notion de classe
    Et voilà.
    Une variable locale static dans une fonction membre est la même qu'une variable locale static dans une fonction isolée : Elle est partagé pour TOUS les appels à cette fonction dans le processus, indépendamment des questions de classe ou de thread.

    Pour le 2, impossible.
    Avec les classes, on n'en a généralement plus besoin : On déclare la variable en question en tant que variable privée membre de la classe, hors de la fonction...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  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
    Citation Envoyé par seriousme
    1)Pourquoi les concepteurs du langage ont ils implémenté ce comportement qui peut sembler paradoxal : un comportement "static" dans une méthode propre à chaque instance?
    La première différence entre un attribut static et une variable de fonction static, c'est avant tout sa visibilité. Ensuite, les variable locales static ne sont pas limitées aux fonctions membres.

    Citation Envoyé par seriousme
    2)Comment faire alors pour avoir 2 instances d'une classe qui accèdent à une donnée "static" par rapport à une méthode, mais pas par rapport à la classe, chaque instance ayant sa propre donnée "static"?
    Comme les autres, dès lors qu'une donnée dépend d'une instance, ce doit être une donnée membre.

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Une variable locale static dans une fonction membre est la même qu'une variable locale static dans une fonction isolée : Elle est partagé pour TOUS les appels à cette fonction dans le processus, indépendamment des questions de classe ou de thread.
    Pour le 2, impossible.
    C'est noté.

    Et donc son "étrangeté" viens du fait que c'est un héritage du C.
    Avec les classes, on n'en a généralement plus besoin : On déclare la variable en question en tant que variable privée membre de la classe, hors de la fonction...
    Mais si on veut que certaine données soient propre à certaines méthodes et ne soient pas accesssibles par d'autres?
    Si il est impossible de gérer cela grâce aux variables "static" est-ce possible?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  17. #17
    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
    Ca fait un moment que je suis le sujet, et je n'arrive toujours pas à voir ce que tu voudrais faire. Tu n'aurais pas un exemple concret ?

  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 Laurent Gomila
    Ca fait un moment que je suis le sujet, et je n'arrive toujours pas à voir ce que tu voudrais faire. Tu n'aurais pas un exemple concret ?
    Il veut un membre donnée qui ne soit visible que d'un seul membre fonction.

    Effectivement impossible en C++, et dans tous les langages que je connais.

    Je crois que la réponse à la question "pourquoi est-ce que static dans une fonction membre non statique n'a pas cet effet?" est que les fonctions membres sont partagées par toutes les instances d'une part et qu'il n'y a pas moyen d'implémenter efficacement ce système avec le modèle de compilation du C++ d'autre part (il faudrait ajouter ce membre à la classe et donc en changer la taille, mais la taille doit être connue dans des contextes où l'implémentation des fonctions membres ne l'est pas, et donc il ne faut pas que cette implémentation puisse nécessiter de faire varier la taille).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  19. #19
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    les fonctions membres sont partagées par toutes les instances
    Ah, ceci explique cela.
    Je pensais que la fonction était dupliquée pour chaque instance comme les données menbres non "static".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    il faudrait ajouter ce membre à la classe et donc en changer la taille, mais la taille doit être connue dans des contextes où l'implémentation des fonctions membres ne l'est pas
    Forcément si le code de la fonction est commun à toutes les instances.

    Merci de ces informations.
    Si vous avez d'autres remarques intéressantes comme celle ci...
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  20. #20
    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
    Je pensais que la fonction était dupliquée pour chaque instance comme les données menbres non "static".
    Les instances ne sont pas forcément connues à la compilation. Et puis on se rend bien vite compte que dupliquer le code des fonctions ne servirait pas à grand chose, puisqu'il est identique pour toutes les instances.

    Une fonction membre (après compilation) n'est rien d'autre qu'une fonction non membre à laquelle on passe en paramètre supplémentaire un pointeur sur l'instance (this).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/06/2014, 11h33
  2. Réponses: 3
    Dernier message: 02/07/2013, 20h49
  3. Problème avec une fonction non static
    Par Coco4486 dans le forum C++
    Réponses: 17
    Dernier message: 09/05/2008, 11h49
  4. Réponses: 4
    Dernier message: 07/04/2007, 20h02
  5. Réponses: 2
    Dernier message: 13/11/2006, 06h42

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