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 : 39
    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
    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.

  2. #2
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    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 :resolu: (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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 : 39
    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
    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.

  5. #5
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    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 :resolu: (en bas)

  6. #6
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    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 confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    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 :resolu: (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 : 39
    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
    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++;
         }

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    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 : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    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 �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    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 confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    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 :resolu: (en bas)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 chevronn�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    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 : 39
    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
    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?

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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).

  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 : 39
    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
    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...

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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