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 :

Lire un fichier .reg + pb singleton


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Par défaut Lire un fichier .reg + pb singleton
    Bonjour,

    J'ai un problème en C++ où je débute. Je suis en période d'essai avec un chef vraiment pas commode ... et je dois réaliser ceci :

    Créer une classe « c_usn_file_registry » qui fournit les 4 méthodes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static bool c_usn_file_registry::instancier_singleton(nmutility::CString nom_fichier)
    Elle crée un singleton « usn_file_registry », lit le fichier .reg (fichier base de registres) donné en argument, et construit une structure de données interne (basée sur « nmutility::CStdMap ») avec l'ensemble des valeurs contenues dans le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static c_usn_file_registry* c_usn_file_registry::get_singleton();
    Elle retourne le singleton créé par instancier_singleton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int c_usn_file_registry::lire_entier(nmutility::CString nom_chemin, nmutility::CString nom_valeur)
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nmutility::CString c_usn_file_registry::lire_chaine(nmutility::CString nom_chemin, nmutility::CString nom_valeur)
    Ces 2 méthodes retournent l'entier ou la chaîne correspondant à la clé demandée (identifiée par son chemin et son nom).

    Un des mes gros problèmes est que je ne sais pas trop ce qu'est un singleton et donc ce que doivent faire get_singleton et instancier_singleton.

    De plus, il n'y aurait pas une bibliothèque qui saurait faire ça, c'est à dire lire des valeurs dans une fichier .reg ?

    Si quelqu'un pouvait m'aider, son aide serait vraiment la bienvenue ...

    Merci.

    Tapiou.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 469
    Par défaut
    Bonjour,

    En mathématiques, un singleton est un ensemble qui contient un et un seul élément. Exemple : { 0 }. Par extension, en programmation orientée objet, on a appelé « singleton » une classe qui est faite pour n'être instanciée qu'une seule fois (ou, à la limite, un nombre fixe et limité) et qui se réfère ensuite toujours à la même instance.

    http://fr.wikipedia.org/wiki/Singlet..._conception%29

    C'est une approche parfois séduisante mais qui a été décriée par certains.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Par défaut
    Merci pour le lien, j'ai la théorie maintenant mais concrètement ?
    Je patauge encore ...

    Tapiou.

  4. #4
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    Pour coder un singleton, il y a plusieurs écoles, mais toutes partent d'une variable globale qui contiendra l'instance unique du singleton, et d'une méthode globale pour la récupérer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class RegReader
    {
       static RegReader* instance;
    public:
       static RegReader* getInstance() { return instance; }
    };
     
    //dans le cpp
    RegReader* RegReader::instance = 0;
    Ca te donne déja l'accès global. Reste ensuite a voir comment tu veux créer ton singleton. Deux options simples :
    Créer une méthode create
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static RegReader* create()
    {
       if(!instance) instance = new RegReader;
       return instance;
    }
    ou alors réécrire getInstance de cette facon afin que getInstance créé l'instance si ce n'est pas fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       static RegReader* getInstance()
    {
       if(!instance) instance=new RegReader;
       return instance;
    }
    Dans tous les cas, il faut coupler ca avec une méthode destroy a appeller quand tu n'as plus besoin du singleton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       static void destroyInstance()
    {
       if(instance) delete instance;
       instance=0;
    }
    Dans tous les cas, constructeur et destructeur privé afin de prévenir une création ou une destruction autrement que par les méthodes fournies

  5. #5
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Par défaut
    Merci Rewpparo !

    Tes explications vont bien m'aider

    Mais bon j'ai encore du travail pour résoudre l'ensemble du problème, vu que je débute en C++ et que j'avance comme une tortue.

    Donc s'il y a une bonne âme qui a des suggestions à me faire, surtout qu'elle n'hésite pas !

    Tapiou.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Rewpparo Voir le message
    Pour coder un singleton, il y a plusieurs écoles, mais toutes partent d'une variable globale qui contiendra l'instance unique du singleton, et d'une méthode globale pour la récupérer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class RegReader
    {
       static RegReader* instance;
    public:
       static RegReader* getInstance() { return instance; }
    };
     
    //dans le cpp
    RegReader* RegReader::instance = 0;
    Ca te donne déja l'accès global. Reste ensuite a voir comment tu veux créer ton singleton. Deux options simples :
    Créer une méthode create
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static RegReader* create()
    {
       if(!instance) instance = new RegReader;
       return instance;
    }
    ou alors réécrire getInstance de cette facon afin que getInstance créé l'instance si ce n'est pas fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       static RegReader* getInstance()
    {
       if(!instance) instance=new RegReader;
       return instance;
    }
    Dans tous les cas, il faut coupler ca avec une méthode destroy a appeller quand tu n'as plus besoin du singleton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       static void destroyInstance()
    {
       if(instance) delete instance;
       instance=0;
    }
    Dans tous les cas, constructeur et destructeur privé afin de prévenir une création ou une destruction autrement que par les méthodes fournies
    Une autre solution consiste à utiliser une variable statique directement dans getInstance:
    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
    class Reader
    {
        public:
            static Reader & getInstance()
            {
                static Reader r;
                return r;
            }
            /* !!!C++11 ony !!!
             * interdire la copie et l'affectation (il faut d'ailleurs veiller à le faire
             * aussi dans la version de Rewpparo ;) )
             */
              Reader(Reader const &) = delete;
              Reader & operator = ( Reader const &) = delete;
     
        /* les fonctions qui vont bien */
        private:
            /* avant C++11 :
             * interdire la copie et l'affectation
             */
           Reader(Reader const &); // déclaré, non implémenté (pour éviter
                                        // que le compilateur ne fournisse la version publique)
           Reader & operator= (Reader const &); // déclaré, non implémenté (pour éviter
                                        // que le compilateur ne fournisse la version publique)
            Reader(); // à implémenter ;)
            ~Reader(); // à implémenter ;)
    }
    Cela permet d'éviter le recours à un pointeur, et donc de garder une syntaxe objet

    Ceci dit
    On ne le répétera jamais assez, mais les singletons et les variables statiques, c'est mal!!!

    La raison principale est qu'une variable statique n'est finalement qu'une variable globale qui se cache bien, mais elle présente exactement les mêmes problèmes en termes de réentrance et de pureté des fonctions!!!

    Le tout, sans oublier que, du fait de sa disponibilité dans l'ensemble du code, l'utilisateur peut etre tenté d'accéder à cette variable globale (ou à ce singleton) depuis des endroits de code auxquels il ne devrait pas pouvoir y accéder, avec tous les risques que cela comporte en terme de dépendances ou de références circulaires!!!

    Et si tu le souhaites, on peut aussi parler des problèmes relatifs à la gestion de threads et des mécanismes nécessaires pour arriver à gérer le singleton de manière thread safe

    Le meilleur moyen de garantir qu'il n'y aura jamais qu'une et une seule instance d'un type donné est encore de déclarer cette variable dans une partie du code que l'on sait n'être utilisée qu'une seule fois (par exemple, au niveau de la classe principale de l'application ) et de veiller à ne transmettre cette variable (sous forme de référence, éventuellement constante) qu'aux fonctions qui en ont impérativement besoin

    Je me suis récemment retrouvé face à un code où il n'y avait pas un singleton, mais carrément plusieurs, avec un singleton qui regroupait, ou peu s'en faut, l'ensemble des fonctionnalités des autres...

    Le problème, quand j'ai voulu apporter une modification due à l'évolution du business, c'est que je me suis aperçu que les singleton "secondaires" (ou du moins celui sur lequel je devais travailler) faisaient régulièrement appel à ce singleton "général"

    Je ne te raconte pas les soucis que cela m'a occasionné pour arriver à faire ce que l'on m'avait demandé
    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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 469
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Je me suis récemment retrouvé face à un code où il n'y avait pas un singleton, mais carrément plusieurs, avec un singleton qui regroupait, ou peu s'en faut, l'ensemble des fonctionnalités des autres...

    Le problème, quand j'ai voulu apporter une modification due à l'évolution du business, c'est que je me suis aperçu que les singleton "secondaires" (ou du moins celui sur lequel je devais travailler) faisaient régulièrement appel à ce singleton "général"

    Je ne te raconte pas les soucis que cela m'a occasionné pour arriver à faire ce que l'on m'avait demandé
    Arrivé à ce point, je pense qu'on peut légitimement se demander en quoi ça reste de la programmation objet. :-) De bonnes vieilles fonctions impératives auraient largement rempli leur mission.

  8. #8
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    Un truc :
    Citation Envoyé par tapiou Voir le message
    De plus, il n'y aurait pas une bibliothèque qui saurait faire ça, c'est à dire lire des valeurs dans une fichier .reg ?
    je pense qu'il te faudra le parser à la main. Utilises fstream pour faire ca.

  9. #9
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Par défaut
    Merci pour l'info, je vais regarder.

    Tapiou.

Discussions similaires

  1. [Servlet][EJB]lire un fichier à partir de mon bean
    Par kimausoleil dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/02/2004, 14h26
  2. [MFC] lire un fichier en int
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 09h32
  3. Réponses: 5
    Dernier message: 11/01/2004, 20h17
  4. Lire un fichier de 50 gb
    Par Maryves dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 14h08
  5. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29

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