fonctions membres statique C++
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

fonctions membres statique C++



  1. #1
    Jack
    Modérateur

    fonctions membres statique C++


    ------

    Bonjour,

    dans une annale d'épreuve d'info, je suis tombé sur la déclaration d'une classe en C++ dans laquelle se trouvaient des méthodes statiques privées. Je pense qu'il s'agit d'une erreur du sujet, ou alors une subtilité m'échappe.

    Pouvez-vous confirmer?

    Merci.

    -----
    Dernière modification par Jack ; 29/05/2012 à 21h50. Motif: orthographe

  2. #2
    inviteb9f49292

    Re : fonctions membres statique C++

    Attention, je ne suis pas un cador du C++, ma réponse est à prendre avec des pincettes. Mais ça ne me choque pas "à prioris", tout dépends de ce que fait la méthode. On pourrait imaginer une classe ne supportant qu'un nombre limité d'insatnce, alors une méthode statique privée, ne faisant qu'incrémenter le nombre d'instance de la classe et appelée par le constructeur, et son pendant, décrémentant le même compteur, appelé par le destructeur... Ces méthodes doivent être statiques (puisque disponible à la 1ère instanciation), et privée (puisque seul le créateur et le destructeur de la classe doivent y accéder)

  3. #3
    Jack
    Modérateur

    Re : fonctions membres statique C++

    Merci pour ta réponse. Il s'agit en effet de gérer un compteur d'instance, donc un membre statique, privé lui aussi dans l'exemple.

    Ces méthodes doivent être statiques (puisque disponible à la 1ère instanciation)
    Je ne comprends pas trop. Une fonction statique est disponible en dehors de toute instantiation.

    Pourquoi donc définir cette fonction comme statique. Une fonction privée non statique aurait pu être appelée par le constructeur et le destructeur pour gérer le nombre d'instances. Me trompe-je?

    A+

  4. #4
    Dlzlogic

    Re : fonctions membres statique C++

    Bonjour,
    Voici une explication de mon bouquin :
    Code:
    class*X*{
    
        static*int*x;
       static const int size =  5;
        class*inner*{
          static*float*f;
          void func(void);   //*déclaration imbriquée
           };
    public :
       char array[size];
    };
    int X::x = 1;
    float X::inner:: f = 3.14;  //*initialisation imbriquée statique
    
    void X::inner::func(void) {    / *définit la fonction imbriquée***/**}
    
    La principale utilité des membres statiques est qu'ils permettent de suivre des données communes à tous les objets d'une classe, comme le nombre d'objets créés, ou la dernière ressource utilisée parmi l'ensemble de celles que partagent tous les objets. Les membres statiques servent aussi à*:
    
     	Réduire le nombre des noms globaux visibles
     	Mettre en évidence les objets statiques qui appartiennent logiquement à une classe
     	Permettre un contrôle d'accès à leurs noms.
    Mais il est vrai que dans l'exemple cité, l'association des 3 termes "méthode, static et private" n'est pas évidente.
    Ceci dit, l'intérêt d'un membre static est qu'il n'en existe qu'une seule copie, qu'il y ait ou non d'instance déclarée de sa classe.
    On se demande alors comment appeler cette fonction si elle est private ?

    PS, je ne sais pas d'où viennent les étoiles ?
    Dernière modification par Dlzlogic ; 29/05/2012 à 12h58.

  5. A voir en vidéo sur Futura
  6. #5
    Dlzlogic

    Re : fonctions membres statique C++

    Après essai, ça peut marcher, si la fonction est appelée par un membre de la classe.
    Donc, en conclusion, je n'imagine pas vraiment l'intérêt.
    J'en conclue que c'est une erreur du sujet, dans la mesure où ça ne sert à rien.

  7. #6
    inviteb9f49292

    Re : fonctions membres statique C++

    Pourquoi donc définir cette fonction comme statique. Une fonction privée non statique aurait pu être appelée par le constructeur et le destructeur pour gérer le nombre d'instances. Me trompe-je?
    Pour ce cas prècis je suppose que oui, je ne vois en effet pas l'intérêt d'utiliser une méthode privée statique au lieu d'une fonction statique. En revanche, on peut estimer que si la méthode statique privée doit accéder à des attributs privés (ou appeler des méthodes privées), alors il faut bien que ce soit une méthode, ou alors il faudrait la déclarer en fonction amie, et les attributs / méthodes auquels elle doit accéder en "protected" et non en private, je crois me semble-t'il? Je t'avais prévenu, je ne fais pas de C++

  8. #7
    Jack
    Modérateur

    Re : fonctions membres statique C++

    Pour ce cas prècis je suppose que oui
    ??? Donc je me trompe?

    on peut estimer que si la méthode statique privée doit accéder à des attributs privés (ou appeler des méthodes privées), alors il faut bien que ce soit une méthode
    Une méthode statique ne peut accéder qu'à des membres statiques.

    ou alors il faudrait la déclarer en fonction amie, et les attributs / méthodes auquels elle doit accéder en "protected" et non en private, je crois me semble-t'il?
    Ceci ne concerne que l'héritage. Toutes les fonctions non statique d'une classe peuvent accéder à tous les membres de cette même classe, qu'ils soient privés ou autres.

    Je t'avais prévenu, je ne fais pas de C++
    C'est pas grave, toute idée est la bienvenue.

    A+

  9. #8
    invite69ba4ee0

    Re : fonctions membres statique C++

    Je ne vois rien d'étonnant à une méthode privée et statique. Cela peut permettre d'encapsuler une variable statique dans la-dite méthode de manière à limiter les opérations dessus. Genre :

    private static int foo::count(int i = 0)
    {
    static counter = 0;

    if ( i > 0 ) count += 1;
    if ( i < 0 ) count -= 1;

    return counter;
    }

    Ou un truc genre (pas testé).

    Donc, ici, le compteur interne ne pourra varier que par pas de une unité, même si on appelle foo::count(-5)

    Je ne pense pas que toute construction de langage a son utilité et sa spécifité : il y a toujours le petit truc qui en fait quelque chose d'unique.

  10. #9
    Jack
    Modérateur

    Re : fonctions membres statique C++

    Pourquoi faire simple quand on peut faire compliqué? Je ne vois pas en quoi le fait de rendre la méthode statique va apporter quoi que ce soit. Le code suivant aura le même effet:
    Code:
    private int foo::count(int i) { static int counter = 0; if ( i > 0 ) counter += 1; if ( i < 0 ) counter -= 1; return counter; }
    En passant:
    Code:
    private static int foo::count(int i = 0)
    ne passera pas à la compilation car on ne peut pas initialiser un paramètre dans la définition d'une fonction.

    A+
    Dernière modification par Jack ; 11/06/2012 à 21h39.

  11. #10
    invite69ba4ee0

    Re : fonctions membres statique C++

    1. L'intérêt de la méthode statique est la performance, et surtout le fait qu'elle peut-être appelée sans référence à une instance.

    Par exemple, avec une méthode non statique, j'aimerais bien savoir comment tu peux faire ceci :

    if ( foo::count() != 0 ) ...

    Puisque quand counter vaut zéro, il n'y a aucun instance.

    Par exemple, dans une classe de gestion de liste d'objet ()genre STL, tu ne t'en tireras pas autrement qu'avec des fonction statiques, dont certaines peuvent être privées ou protégées.

    Je le répète, toute construction à un intérêt spécifique. C'est justement par des commentaires pareils, et en utilisant mal C++, qu'on fait trop compliqué, trop bogué, et que la réputation de C++ a été abîmée. Il faut l'utiliser de manière juste et pertinente. C'est de la dentelle. Ne crois jamais que tu sais tout, que tu as tout découvert, en C++. Il y a toujours de nouvelles choses à apprendre, même après 10 ou 20 ans. C'est un langage extraordinairement riche.

    2. J'ai voulu donner une idée, je n'ai pas compilé le code. Je ne vais pas passer 1/4h sur chaque post. Pour quelqu'un qui n'a plus fait de C++ depuis près de 10 ans, ce n'est pas si mal, je crois, d'écrire ça en 2 minutes . (Par contre, j'ai été bêta-testeur du compilateur C++ de Silicon Graphics, et de Metrowerks, le meilleur compilateur sur MacOS avant l'ère MacOS X... et je leur en ai trouvé des bugs, et pas des faciles).

    Maintenant, je ne vais pas rentrer dans une polémique : chacun prend ce qu'il veut des autres.

  12. #11
    Jack
    Modérateur

    Re : fonctions membres statique C++

    1. L'intérêt de la méthode statique est la performance, et surtout le fait qu'elle peut-être appelée sans référence à une instance.

    Par exemple, avec une méthode non statique, j'aimerais bien savoir comment tu peux faire ceci :

    if ( foo::count() != 0 ) ...
    Je n'ai aucun problème avec l'intérêt des méthodes statiques d'une manière générale. J'avais un problème lorsqu'elles étaient privées. Comment fais-tu pour appeler count() si elle est privée?

    A+

  13. #12
    invite69ba4ee0

    Re : fonctions membres statique C++

    Comme toute autre méthode privée : d'autres méthode de la classe. Dans ce cas-ci probablement in fine des méthode statiques publiques, du genre dans l'exemple de listes des add, remove etc..., ou pour les listes des push, pop etc...

  14. #13
    Jack
    Modérateur

    Re : fonctions membres statique C++

    Dans ce cas-ci probablement in fine des méthode statiques publiques
    On tourne en rond. Pourquoi rendre cette méthode statique? Une méthode privée suffirait si c'est uniquement pour se faire appeler par des méthodes statiques publiques.

    A+

  15. #14
    invite765732342432
    Invité

    Re : fonctions membres statique C++

    Citation Envoyé par Jack Voir le message
    Une méthode privée suffirait si c'est uniquement pour se faire appeler par des méthodes statiques publiques.
    Les méthodes statiques publiques peuvent être appelées sans instanciation, et sans instanciation, il faut bien que la méthode privée en question soit elle aussi statique, sinon elle n'est pas appelable. Non ?

    Enfin... ça fait longtemps que je n'ai pas joué avec du C++

  16. #15
    Dlzlogic

    Re : fonctions membres statique C++

    Bonjour,
    Conformément à ce que j'ai dit dans mon post précédent, je n'ai pas réussi à compiler et exécuter une méthode privée statique.
    Le rajout d'une méthode intermédiaire pour permettre de l'appeler, ne présente à mon avis pas beaucoup d'intérêt.
    J'ai fait un gestionnaire d'instance, mais dans ma logique, ce gestionnaire doit être indépendant des classes concernées.
    Les petites fonctions "vachement géniales", j'en suis revenu, je préfère faire du solide et que j'arrive à comprendre quand je vais y jeter un coup d’œil.

  17. #16
    invite69ba4ee0

    Re : fonctions membres statique C++

    Non, une methode statique n'a pas besoin que des instances de la classe (des objets si tu préfères) existent pour pour voir être appelée, une méthode non statique, si.

    Dans le cas d'une liste, tu pourrais très bien avoir une méthode publique statique du style :

    static int foo:: isEmpty()
    {
    return ( foo::count() == 0 );
    }

    Si foo::count n'est pas statique, il n'existe pas d'instance de la classe sur laquelle s'appuyer pour tester si la liste est vide, puisque, par définition, on veut justement tester si elle est vide, donc si il n'existe aucune instance.

    Sans compter que, si on s'appuyait ici sur une instance de la classe, cela rendrait le code moins lisible, puisque cette instance n'interviendrait aucunement dans l'algorithme de la fonction. Pour prendre un autre exemple, si tu as besoin d'un seul paramètre pour une fonction, tu ne vas pas arbitrairement en ajouter un juste pour le plaisir. Il faut toujours considérer une méthode non statique comme recevant un paramètre supplémentaire : this. Donc, si tu n'as pas besoin de this, dans ta méthode, et que tu ne prévois pas d'avoir besoin du polymorphisme pour les classe filles, alors il est indiqué d'utiliser une méthode statique. Les méthodes statiques sont liées à la classes, les méthodes non statiques aux objets (aux instances de la classes). Il n'y a aucune raison qu'une méthode liée à la classe ne puisse pas être privée, et il n'y a pas lieu de décider d'avance qu'il ne peut pas y avoir de situation où ça ne devrait pas être le cas. En réalité, c'est tout le contraire.

  18. #17
    invite69ba4ee0

    Re : fonctions membres statique C++

    Citation Envoyé par Jack Voir le message
    Une méthode privée suffirait si c'est uniquement pour se faire appeler par des méthodes statiques publiques.
    Non, une methode statique ne peut pas appeler une méthode non statique. Il lui manquerait une chose à fournir : le pointeur this.

  19. #18
    Jack
    Modérateur

    Re : fonctions membres statique C++

    Citation Envoyé par Faith Voir le message
    Les méthodes statiques publiques peuvent être appelées sans instanciation, et sans instanciation, il faut bien que la méthode privée en question soit elle aussi statique, sinon elle n'est pas appelable. Non ?
    Effectivement, seule une méthode statique privée pourra être appelée par une autre méthode statique publique (ou non).

    Conformément à ce que j'ai dit dans mon post précédent, je n'ai pas réussi à compiler et exécuter une méthode privée statique.
    Je viens de vérifier pour tester ce que disais Faith et la méthode statique privée se compile bien.

    Merci à tous

    A+

Discussions similaires

  1. Membres fantômes
    Par invitecfe912f5 dans le forum Biologie
    Réponses: 5
    Dernier message: 13/04/2004, 16h57