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

SL & STL C++ Discussion :

Vecteurs non remplis, et classe Singleton.


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut Vecteurs non remplis, et classe Singleton.
    Bonjour.
    Je suis entrain de coder un petit programme qui est sensé transformer un fichier csv en script SQL. Pour cela j'ai écrit différentes structures de données, et une classe registre (singleton), qui contient plein de vecteurs pour stocker mes structures de données.
    Lorsque je fais appel à la fonction getInstance() de ma classe Registre, celle-ci (re)crée une nouvelle instance et je n'accède plus à mes vecteurs. y'a-t'il une subtilité, en C++, dans l'écriture d'une classe Singleton que je n'aurai pas saisie? Serait-ce à cause du destructeur public?

    PS: Voila mes code soerce qui me pose problème:
    registre.h:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #ifndef REGISTRE_H
    #define REGISTRE_H
    #include <vector>
    #include "structures.h"
     
    using namespace std;
     
    class Registre
    {
        public:
            static Registre& getInstance();
     
            bool impactExists(const Impact& impact);
            void addImpact(const Impact& impact);
     
            bool incidentExists(const Incident& incident);
            void addIncident(const Incident& incident);
     
            bool plateformeExists(const Plateforme& plateforme);
            void addPlateforme(Plateforme& plateforme);
     
            bool sousTypeJeuExists(const SousTypeJeu& sousTypeJeu);
            void addSousTypeJeu(SousTypeJeu& sousTypeJeu);
     
            bool typeImpactExists(const TypeImpact& typeImpact);
            void addTypeImpact(TypeImpact& typeImpact);
     
            bool typeIncidentExists(const TypeIncident& typeIncident);
            void addTypeIncident(TypeIncident& typeIncident);
     
            bool typeJeuExists(const TypeJeu& typeJeu);
            void addTypeJeu(TypeJeu& typeJeu);
     
            virtual ~Registre();
        protected:
        private:
            Registre();
     
            vector<Impact> impacts;
            vector<Incident> incidents;
            vector<Plateforme> plateformes;
            vector<SousTypeJeu> sousTypesJeu;
            vector<TypeImpact> typesImpact;
            vector<TypeIncident> typesIncident;
            vector<TypeJeu> typesJeu;
    };
     
     
     
    #endif // REGISTRE_H
    l'implémentation de ma fonction getInstance():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Registre& Registre::getInstance() {
        static Registre instance;
        return instance;
    }
    PS2: J'utilise mingw sur un windows XP pro SP2, sur un processeur Intel Pentium 4 HT.
    Ancien membre du projet "Le Dernier Âge".

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Lorsque je fais appel à la fonction getInstance() de ma classe Registre, celle-ci (re)crée une nouvelle instance et je n'accède plus à mes vecteurs.
    Pourtant elle ne devrait pas. Comment le vérifies-tu ?

  3. #3
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Merci de ta réponse.

    En fait j'ai fais le test, en déclarant une variable globale (de type Registre donc), et je la passe en parametre (apres avoir appelé getInstance()), là, les vecteurs se remplissent normalement, aucun soucis, mais ce n'est pas très propre.
    Lorsque j'appelle getInstance() pour une variable locale, là les vecteurs ne se remplissent plus.

    Mais, en cherchant de mon coté, j'ai trouvé une solution qui fonctionne a mon problème, j'ai réectifié le code en employant un pointeur en variable membre statique, pour l'instance. voici les modifications que j'ai apporté. En espérant que cela aide ceux qui auront un problème similaire au mien:

    Registre.h:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #ifndef REGISTRE_H
    #define REGISTRE_H
    #include <vector>
    #include "structures.h"
     
    using namespace std;
     
    class Registre
    {
        public:
            static Registre* getInstance();
            static void destroyInstance();
     
            bool impactExists(const Impact& impact);
            void addImpact(const Impact& impact);
     
            bool incidentExists(const Incident& incident);
            void addIncident(const Incident& incident);
     
            bool plateformeExists(const Plateforme& plateforme);
            void addPlateforme(Plateforme& plateforme);
     
            bool sousTypeJeuExists(const SousTypeJeu& sousTypeJeu);
            void addSousTypeJeu(SousTypeJeu& sousTypeJeu);
     
            bool typeImpactExists(const TypeImpact& typeImpact);
            void addTypeImpact(TypeImpact& typeImpact);
     
            bool typeIncidentExists(const TypeIncident& typeIncident);
            void addTypeIncident(TypeIncident& typeIncident);
     
            bool typeJeuExists(const TypeJeu& typeJeu);
            void addTypeJeu(TypeJeu& typeJeu);
        protected:
        private:
            Registre();
            ~Registre();
     
            static Registre *instance;
            vector<Impact> impacts;
            vector<Incident> incidents;
            vector<Plateforme> plateformes;
            vector<SousTypeJeu> sousTypesJeu;
            vector<TypeImpact> typesImpact;
            vector<TypeIncident> typesIncident;
            vector<TypeJeu> typesJeu;
    };
     
     
     
    #endif // REGISTRE_H
    Comme vous pouvez le voir j'ai mis le destructeur en privé et ajouté une fonction destroyInstance() à appeler en fin de programe (je me demande d'ailleurs si je devrais pas la mettre en privé et ajouter une fonction amie de finalisation de programme).

    Et voici les bots de codes que j'ai ajouté et modifié dans Registre.cpp:
    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
    Registre *Registre::instance = NULL;
     
    Registre *Registre::getInstance() {
        if (Registre::instance == NULL) {
            Registre::instance = new Registre();
        }
        return Registre::instance;
    }
     
    void Registre::destroyInstance() {
        if (Registre::instance != NULL) {
            delete Registre::instance;
            Registre::instance = NULL;
        }
    }
    Ancien membre du projet "Le Dernier Âge".

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En fait j'ai fais le test, en déclarant une variable globale (de type Registre donc), et je la passe en parametre (apres avoir appelé getInstance()), là, les vecteurs se remplissent normalement, aucun soucis, mais ce n'est pas très propre.
    Lorsque j'appelle getInstance() pour une variable locale, là les vecteurs ne se remplissent plus.
    J'ai pas très bien compris ce que tu faisais, mais j'ai l'impression que cela ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Registre r = Registre::getInstance();
    D'ailleurs ton singleton n'en est pas vraiment un, puisqu'il est tout à fait possible de créer plusieurs instances. Il faut déclarer le constructeur par copie et l'opérateur d'affectation en accès privé (et ne pas les implémenter). Ainsi toute tentative de copie, implicite ou non, causera une erreur de compilation ou d'édition de liens.

    Mais, en cherchant de mon coté, j'ai trouvé une solution qui fonctionne a mon problème, j'ai réectifié le code en employant un pointeur en variable membre statique, pour l'instance. voici les modifications que j'ai apporté. En espérant que cela aide ceux qui auront un problème similaire au mien:
    C'est pas vraiment une solution, et ça me conforte dans l'idée que tu utilisais mal les références. Si tu n'as pas besoin de gérer la durée de vie du singleton, la première solution restera la meilleure.

  5. #5
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Le bout de code que tu as écrit est bien ma manière d'utiliser ma classe.

    Pour ce qui est des constructeur par copie, c'est vrai que j'ai complètement oublié de le mettre en privé. Si utiliser un pointeur n'est pas correct alors, je vais essayer de trouver des exemples de Singleton en C++.
    Ancien membre du projet "Le Dernier Âge".

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le bout de code que tu as écrit est bien ma manière d'utiliser ma classe.
    Je ne sais pas si tu as compris l'erreur, donc au cas où : il faut récupérer ton instance par référence, sinon tu vas la copier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Registre& r = Registre::getInstance();
    Si utiliser un pointeur n'est pas correct
    Ca l'est, mais ce n'est peut-être pas nécessaire si tu peux utiliser la première forme (qui est plus simple).

    je vais essayer de trouver des exemples de Singleton en C++.
    Je pense que tu en trouveras pas mal
    Mais ta première version était bonne, si tu lui rajoutes l'interdiction du constructeur par copie et de l'opérateur =.

  7. #7
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    En effet, le "&" manquait dans ma ligne. maintenant le résultat est meilleur. Merci beaucoup(je préfère aussi travailler avec des références qu'avec des pointeurs).
    Ancien membre du projet "Le Dernier Âge".

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Note que tu peux tout aussi bien renvoyer une référence lorsque tu stockes un pointeur sur ton instance. En fait renvoyer un pointeur n'est nécessaire que lorsque l'instance peut être nulle, donc lorsque tu gères explicitement sa destruction et qu'il n'y a pas reconstruction automatique.

  9. #9
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    C'est noté, merci encore pour ton aide.
    Ancien membre du projet "Le Dernier Âge".

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/12/2010, 18h12
  2. Vecteurs non remplis, et classe Singleton.
    Par Floréal dans le forum C++
    Réponses: 8
    Dernier message: 23/05/2007, 09h28
  3. [introspection][singleton] introspetion de classe à singleton
    Par Jaxofun dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 18/08/2005, 09h59
  4. fonctionnement de la classe Singleton
    Par lepoutho dans le forum C++
    Réponses: 11
    Dernier message: 04/08/2005, 09h28

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