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 :

classe friend vs fonctions globales vs ...


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut classe friend vs fonctions globales vs ...
    bien le bonsoir,

    j'ai un grand nombre de classes toutes liées entre elles par des héritages et/ou qui s'appellent entre elles. Et à différents étages et dans différentes branches de mon arbre d'héritage, j'ai besoin d'utiliser des données et des fonctions communes. Ces données ne se rapportent à aucun objet en particulier, ce sont juste des données et fonctions utilisées un peu partout dans le code.

    pour schématiser, disons que j'ai des classes A et B qui doivent toutes les 2 accéder à des données et à des fonctions externes sans créer d'autres objets que les instances de A et B.

    Quel est le meilleur moyen de déclarer et utiliser ces données et fonctions communes pour faire un code propre ? (en ne définissant les fonctions et données qu'une seule fois, bien sûr)
    créer une classe amie jamais instanciée ?
    créer des fonctions globales (sûrement pas ...)

    A quoi devraient ressembler les déclarations de mes fonctions et données communes et de mes classes A et B ?

  2. #2
    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 : 37
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    En utilisant les traits peut être mais j'y connais rien.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    créer des fonctions globales (sûrement pas ...)
    Oui, mais dans un espace de nom.
    Boost ftw

  4. #4
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Tu ne peux pas mettre en place une classe singleton du style PublicData qui contiendrai toutes les données et les fonctions partagées dont tu as besoin ?

    Singleton avec la librairie Loki par exemple...

    : Peutetre qu'il faut mettre en place les protections qu'il faut en cas d'acces multithread...

    Si ça donne une classe qui fait un peu tout et n'importe quoi je ne crois pas que ce soit une bonne solution non plus...
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Une alternative à des méthodes globales dans un espace de noms consiste à utiliser des méthodes statiques dans une classe qui ne contiendrait que ces méthodes.

    Mais c'est vrai que c'est moyen. En fait, pour pouvoir vraiment t'aider et juger, je pense qu'il faudrait connaître les détails de ton architecture et voir quels sont les fonctions que tu souhaites partager.

  6. #6
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par dabeuliou
    En fait, pour pouvoir vraiment t'aider et juger, je pense qu'il faudrait connaître les détails de ton architecture et voir quels sont les fonctions que tu souhaites partager.
    les fonctions que j'ai à partager sont des fonctions de gestion de chaines de caractères aussi bien que des fonctions de gestion d'un système de fichiers virtuel (open, close ... dont j'ai besoin dans un bon paquet de classes). Et je dois aussi partager des pointeurs vers des objets comme par exemple la racine de mon système de fichiers.

    Ces données / fonctions doivent être connues quasiment partout.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Des fonctions de gestion de chaînes de caractères ou de gestion de fichiers ? Pourquoi tu n'as pas une classe "chaîne de caractères" (dérivant peut-être de std::string, pourquoi pas) et une classe "fichier" ?

  8. #8
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Perso je ferai vraiment un singleton :/
    Par exemple :

    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
     
    namespace Loki {
      template <class T> struct CreateUsingNew ;
    } ;
     
    class PublicDataAndFunctions {
    protected:
      // Constructeur/Destructeur protégé et inaccessible au public sauf pour Loki.
      friend Loki::CreateUsingNew<PublicDataAndFunctions>;
      PublicDataAndFunctions(void);
      ~PublicDataAndFunctions(void);
    public:
      // Accés au singleton.
      static PublicDataAndFunctions& getInstance();
      static PublicDataAndFunctions& myPublicDataAndFunctions();
    public:
      // Fonctions et accesseurs public.
      ...
    private: 
      // Fonctions et attributs privés.
      ...
    };
    Avec

    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
     
    #include "PublicDataAndFunctions.h"
    #include <Loki/Singleton.h>
     
    PublicDataAndFunctions::PublicDataAndFunctions(void)
    {
    }
     
    PublicDataAndFunctions::~PublicDataAndFunctions(void)
    {
    }
     
    PublicDataAndFunctions& PublicDataAndFunctions::
    getInstance()
    {
      return Loki::SingletonHolder<PublicDataAndFunctions>::Instance();
    }
     
    PublicDataAndFunctions& PublicDataAndFunctions::
    myPublicDataAndFunctions()
    {
      return getInstance();
    }
    Utilisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    #include "PublicDataAndFunctions.h"
    ...
    PublicDataAndFunctions::myPublicDataAndFunctions().UneFonctionPublic(...);
    ...
    PublicDataAndFunctions::myPublicDataAndFunctions().getDataTruc(...);
    ...
    ça permet, il me semble de faire exactement ce que tu veux non ? La classe PublicDataAndFunctions assure qu'il n'y ai qu'une et une seule instance de celle-ci. La construction/destruction de celle-ci est automatiquement géré par le singleton (ça fait propre ^^).

    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  9. #9
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par dabeuliou
    Des fonctions de gestion de chaînes de caractères ou de gestion de fichiers ? Pourquoi tu n'as pas une classe "chaîne de caractères" (dérivant peut-être de std::string, pourquoi pas) et une classe "fichier" ?
    J'ai ces classes. C'est juste que certaines fonctions ne se rapportent à aucun objet et peuvent potentiellement être appelées depuis n'importe quelle classe. Je ne peux donc les associer à aucune classe déjà existante.

    et pour l'histoire du singleton, je vais regarder ça.

    Merci à tous pour ces éclaircissements.

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

Discussions similaires

  1. Fonction globales ou classe utilitaire ?
    Par oodini dans le forum C++
    Réponses: 9
    Dernier message: 03/09/2008, 15h16
  2. Réponses: 3
    Dernier message: 14/12/2006, 10h09
  3. [class] Ajouter class devant une fonction
    Par Pedro dans le forum Langage
    Réponses: 12
    Dernier message: 07/03/2005, 13h11
  4. Réponses: 4
    Dernier message: 17/03/2004, 17h24
  5. Fichier de fonctions globales
    Par PEM dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/07/2002, 21h35

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