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

Langage C++ Discussion :

[Avis/Débat] Fonctions libres vs fonctions statiques dans une classe


Sujet :

Langage C++

  1. #1
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut [Avis/Débat] Fonctions libres vs fonctions statiques dans une classe
    Bonjour à tous.

    Je m'intéresse à l'opposition qu'il existe entre les fonctions statiques d'une classe et les fonctions libres.
    Pourquoi choisir plutôt l'un que l'autre ? Certains cas sont évidents (operator<< par exemple) mais la grande majorité ne le sont pas
    et je cherches des arguments qui peuvent les départager.

    En réfléchissant et en fouillant sur le net, j'en arrive aux points suivants
    1) Les fonctions statiques ont de facilités pour partager des arguments. Dès lors, dès que plusieurs services sont offerts par des fonctions et qu'un contexte est partagé par les dites fonctions, alors celles ci devraient être statique à une classe.

    2) Les types sont les paramètres des classes templates et les classes avec des fonctions statiques jouent un grand rôle dans ce domaine de la programmation

    3) Les fonctions libres offrent une meilleurs réutilisabilité (exemple avec <algorithms>) et permettent dans une certaines mesure une meilleure abstraction (template <class T> void foo(T& v){ //what you whant qui utilise v.begin()} n'est pas toujours valide alors que begin(v) l'est, que v soit un std::vector ou tableau C-like)

    Je ne pense pas avoir fait le tour de la question et c'est pourquoi je sollicite vos avis.

    Merci.
    David Côme.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  2. #2
    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
    La vraie question est pourquoi ne pas introduire plutôt un namespace (ce qui est bien souvent mon choix). Et bien souvent la chose qui m'incite à avoir des membres statiques dans une classe plutôt qu'un namespace, c'est la possibilité de passer une classe en paramètre template. Le fait que les namespaces soient ouverts et les classes fermées est un autre facteur (souvent en faveur des namespaces).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    La vraie question est pourquoi ne pas introduire plutôt un namespace (ce qui est bien souvent mon choix). Et bien souvent la chose qui m'incite à avoir des membres statiques dans une classe plutôt qu'un namespace, c'est la possibilité de passer une classe en paramètre template. Le fait que les namespaces soient ouverts et les classes fermées est un autre facteur (souvent en faveur des namespaces).
    J'ai écrit ce message à une heure tardive mais la présence de namespace était sous entendue dans mon esprit mais pas dans mon message
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'ai l'impression qu'on n'utilise les fonctions statiques que quand toutes les instances d'une classe partagent des données communes, qu'il faut manipuler (en gros, donc pour manipuler les données statiques d'une classe...)

    En général, cela apparait dans deux contextes

    1- quand toutes les instances de la classe partagent des données (statiques), la fonction statique est le moyen d'accéder ou de manipuler ces données. Il peut s'agir d'éléments de typage, ou de données communes liées à l'implémentation (par exemple dans un modèle de type poids mouche, ou toutes les instances d'une classe mettent en commun certains paramètres d'implémentation)
    2- dans les classes ayant des caractéristiques de singleton, c'est à dire ou les instances ne sont que des "images" distinctes d'un objet unique. On aura généralement alors une données statique (l'objet singleton sous jacent) et des fonctions statiques pour le manipuler.

    En dehors de ces deux situations (qui ne sont pas très différents, en fait), et dans la mesure où l'on a les espaces de nommage, je ne vois pas très bien l'intérêt des fonctions statiques.

    Francois

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Outre ce qui a déjà été dit (classe->template, namespace pour fonctions libres), un cas où je mets une fonction statique dans une classe, c'est lorsqu'elle est utilisée comme callback et en général se contente d'appeler une fonction membre de l'objet passé en paramètre.

  6. #6
    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
    C'est aussi une alternative à friend quand il faut que la fonction puisse accéder à des membres privés.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. [1.x] déclarer variables statiques dans une classe controller
    Par flora806 dans le forum Symfony
    Réponses: 8
    Dernier message: 15/10/2012, 17h26
  2. Réponses: 4
    Dernier message: 02/08/2010, 15h13
  3. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  4. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  5. membre statique dans une classe
    Par motrin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/12/2005, 15h15

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