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 :

Question philosophique fonction statique


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut Question philosophique fonction statique
    Bonjour,

    J'ai une petite question philosophique et je n'ai pas su trancher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A
    {
    public:
       ...
     
    private:
       static inline const char *MonFormat1(void) { return "==> %d"; }
       inline const char *MonFormat2(void) const { return "==> %d"; }
    };
    La classe A dispose d'une fonction retournant un format d'affichage à utiliser. J'ai 2 possibilités :
    - la déclarer en statique (comme pour la fonction MonFormat1)
    - la déclarer en membre constant (comme pour la fonction MonFormat2)


    Cette fonction est privée car elle n'a pas besoin d'être connue à l'extérieur de la classe.

    Cette fonction ne manipule aucunes des variables membres de la classe.

    J'aurai aussi pu remplacer cette fonction par un #define.

    Je n'ai pas trouvé de raisons valables permettant de choisir une option plutôt que l'autre, donc si vous avez des idées, je suis preneur.

    Raymond
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Cette fonction ne manipule aucunes des variables membres de la classe.
    Donc, statique, non ? Imagine qu'un jour tu ajoutes une méthode statique appelant MonFormat2, tu seras bien obligé de la rendre statique.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Il y a aussi la possibilité de retirer complètement cette méthode de la classe et d'en faire une fonction locale, ce qui permet de la définir dans le .cpp au lieu du .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    namespace
    {
      const char *MonFormat2() { return "==> %d"; }
    }
    C'est personnellement ce que je fais de plus en plus, ça permet de cacher plein de choses aux utilisateurs de la classe et d'alléger les fichiers de déclarations.

    MAT.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    namespace
    {
      const char *MonFormat2() { return "==> %d"; }
    }
    Juste pour avertire. Si t'as fonction est codé comme cela. tu fait des erreurs memoire :
    1- tu entre dans la fonction
    2- une tableau de char est créé avec "==> %d" dedans
    3- tu retourne la position memoire du premier caractère
    4- le tableau est détruit => ce que tu récupérer n'est plus valide

    Faut faire un truc comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace
    {
      const char *MonFormat2() 
    { 
    static const char  * s =   "==> %d";
    return s; }
    }
    }

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Je crois que les chaînes en dur sont statiques, mais d'un autre côté ça fait des années que je n'ai pas fait de C donc je me trompe peut-être...

    MAT.

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

    Informations professionnelles :
    Activité : aucun

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

    De manière générale, s'il y a moyen d'éviter une instruction #define en la remplaçant par autre chose, il faut le faire (pour ainsi dire) systématiquement.

    La raison est relativement simple: un #define est une instruction pré processeur, c'est à dire qu'elle est gérée avant même la compilation, et n'offre aucune sécurité.

    Si tu crées (idéalement) un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef mondef
    #define mondef "==>%d"
    #endif
    mondef sera remplacé par blabla dans tous les endroits du code où il apparaît, sans vérifier qu'il soit "logique" ni même sensé de le faire.

    Ainsi un
    ne sera pas vérifié avant la compilation, qui sortira sur une erreur... et comme la modification aura été faite, il sera difficile de comprendre l'erreur

    Le fait de définir une fonction statique permet, par contre, d'effectuer un test de "cohérence" quant au type utililsé (entre le type de retour de la fonction ou le type de la variable statique et le type de la variable à initialiser).
    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

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Je crois que les chaînes en dur sont statiques, mais d'un autre côté ça fait des années que je n'ai pas fait de C donc je me trompe peut-être...
    Non non, tu as bon...
    Citation Envoyé par Le standard, 2.13.4
    An ordinary string literal has type “array of n const char” and static storage duration (3.7),
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. [VS.net 2005] Question philosophique sur les objets
    Par WriteLN dans le forum Framework .NET
    Réponses: 8
    Dernier message: 23/08/2007, 10h34
  2. Réponses: 1
    Dernier message: 25/05/2007, 14h33
  3. [REGEXP] Question Utilisation fonction replace
    Par calitom dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/03/2007, 17h39
  4. [AS2] Pb accès fonctions statiques
    Par wwave dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 08/02/2006, 14h18
  5. [MFC] Pointeur this et fonctions statiques
    Par Yellowmat dans le forum MFC
    Réponses: 5
    Dernier message: 08/02/2005, 10h15

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