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 :

Appel des fonctions statiques d'une classe


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Appel des fonctions statiques d'une classe
    Bonjour tout le monde,

    J'aimerais créer une classe possédant des fonctions statiques et pouvoir les appeler dans une autre classe sans avoir à faire à chaque fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomDeMaClasse::nomDeMaFonction();
    Mais juste en faisant :

    Ca me fait penser aux fonctions comme cout qui ont besoin du namespace std pour fonctionner, moi j'aimerais bien un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using classe nomDeMaClasse;
    Si vous voyez ce que je veux dire

    Merci pour votre aide.

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    Si ta classe contient uniquement des fonctions statiques, pourquoi ne pas la transformer en namespace ?
    Ca te permettrait de faire un using namespace mon_namespace; et d'utiliser les fonctions de la manière que tu souhaites
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

    Informations professionnelles :
    Activité : aucun

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

    Es tu vraiment si fainéant que cela ou as tu peur d'user ton clavier

    Sincèrement, avec la complétion automatique, cela ne prend pas tellement de temps que cela

    Mais, pour répondre à ta question, non, il n'y a pas de moyen "direct", et c'est tant mieux:

    Même si une fonction statique ne dépend d'aucune instance de la classe, elle fait malgré tout partie intégrante de la classe, et il est vraiment préférable de ne pas perdre la connaissance de ce fait.

    En effet, une fonction membre de classe (qu'elle soit statique ou non) correspond à un service que l'on est en droit d'attendre de la part de cette classe, et deux classes n'ayant pourtant aucun lien (ni d'héritage ni autre) peuvent très bien... fournir un service équivalent (ou que l'on aura à tout le moins nommé de manière similaire).

    Si tu perds l'information relative à la classe d'origine pour la fonction, le lecteur du code (que ce soit toi dans quelques mois, quand tu auras oublié ce que tu as fait ou quelqu'un d'autre) aura d'énorme difficultés de compréhension du code et en viendra "fatalement" à se demander la classe à laquelle l'appel de la fonction aparatient.

    Ceci dit, il y a malgré tout un moyen indirect d'y arriver, même si tu auras compris que je ne cautionne absolument pas le fait d'y recourir:

    Il "suffit" de rajouter une fonction libre (de préférence inline) qui fera appel à la fonction statique de la classe.

    Plutôt que d'utiliser la fonction statique de ta classe, il te suffira alors d'utiliser la fonction libre.

    Cela pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct MyClass
    {
        static void foo(){std::cout <<"hello"<<std::endl;}
    };
    void foo(){MyClass::foo();}
    int main()
    {
        foo();
     
        return 0;
    }
    Je sais que je me répète, mais je déconseille malgré tout très fortement le recours à cette technique
    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
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Si ta classe contient uniquement des fonctions statiques, pourquoi ne pas la transformer en namespace ?
    Ca te permettrait de faire un using namespace mon_namespace; et d'utiliser les fonctions de la manière que tu souhaites
    Peut etre parce que la classe dispose également de variable membres et qu'il n'est pas forcément intéressant d'y donner un accès à tout va
    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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Peut etre parce que la classe dispose également de variable membres et qu'il n'est pas forcément intéressant d'y donner un accès à tout va
    Bien joué, c'est exactement ça !

    Merci pour ta réponse, tu as raison, c'est pas très protégé tout ça

    Mais je vais quand même le faire en combinant vos deux idées, si je reprends l'exemple de la fonction foo() de koala01 qui reprend la fonction statique de ma classe, je peux tout simplement la mettre dans un namespace, me permettant de brider un peu tout ça en forçant le développeur (que ce soit moi ou quelqu'un d'autre) à faire un using namespace

  6. #6
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Attention à ne pas conserver le mot clé static devant tes méthodes si tu transforme le tout en un namespace : la signification du mot change selon son emploi.
    Nullius in verba

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Bonjour tout le monde,

    Je viens poster ma solution. J'ai un peu galéré n'étant pas encore totalement à l'aise avec tous les principes du c++, aussi, je ne suis pas sûr d'avoir respecté "l'éthique" mais bon ça marche !

    Comme je l'avais dit dans mon message précédent j'ai fait un mélange des deux solutions pour sécuriser un minimum, tout en faisant ce que je cherchais à faire

    Deux fonctions tac et toc (pour ceux qui font du matlab, c'est l'équivalent des fonctions tic et toc qui servent à mesurer la rapidité d'une action).
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tac();
     
    // action
     
    toc();
    Pour moi la fonction toc affiche le temps écoulé depuis tac dans la console de QtCreator (grâce au QDebug()). Mais on peut la modifier pour écrire dans un fichier...

    Avant d'utiliser ces fonctions il faut inclure le header et faire le using namespace tt.

    Contenu du header :
    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
     
    #ifndef TACTOC_H
    #define TACTOC_H
     
    #include <QtGui>
     
    class ctactoc
    {
    public :
        ctactoc();
        static void tac();
        static void toc();
     
    private :
        static double depart;
        static double arrivee;
    };
     
    namespace tt
    {
    inline void tac(){ ctactoc::tac();}
    inline void toc(){ ctactoc::toc();}
    }
    #endif // TACTOC_H
    Contenu du fichier source:
    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
    25
    26
    27
    28
     
    #include "tactoc.h"
     
    ctactoc::ctactoc()
    {
    }
     
    double ctactoc::depart = 0;
    double ctactoc::arrivee = 0;
     
    void ctactoc::tac()
    {
        depart = QDateTime::currentMSecsSinceEpoch();
    }
     
    void ctactoc::toc()
    {
        if(depart != 0)
        {
            arrivee = QDateTime::currentMSecsSinceEpoch() - depart;
            depart = 0;
            qDebug() << arrivee;
        }
        else
        {
            qDebug() << -1;
        }
    }
    L'intérêt d'une telle classe, c'est que je peux l'exporter dans tous mes projets et l'utiliser vraiment rapidement (et oui je suis flemard !).

    Si vous avez des suggestions, conseils, ou réprimandes () n'hésitez pas, j'apprends donc j'ai besoin de tout ça pour progresser

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Il est possible de faire un pointeur sur fonction membre, ce qui t'évitera de rappeler le nom de la classe.

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 14/01/2011, 16h56
  2. recuperer la liste des propriétés statiques d'une classe ?
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 22/11/2009, 12h50
  3. Réponses: 5
    Dernier message: 22/06/2009, 11h02
  4. Réponses: 2
    Dernier message: 19/09/2006, 19h06
  5. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35

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