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 :

Passer des paramètres à un singleton


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut Passer des paramètres à un singleton
    Bonjour àvous,
    j'ai une appli qui implémente un DP singleton.
    J'aimerais savoir comment on peut passer des paramètres au constructeur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class CApp
    {
    private:
    	int m_i1;
    	CApp(int i1): m_i1(i1) {}
    public:
    	static CApp& GetInstance() {
    		static CApp s_app;
    		return s_app;
    	}
    //Comment faire ...
    };

  2. #2
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Hs: Personellemnt, j'ai tendance à préférer un pointeur dans mes Singletons.

    Sinon,bah tu modifie les paramètres de GetInstance de tel sorte que tu passe à ton objet tout ce que veux non ?
    "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)

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Par défaut
    Salut olive_le_malin,

    Je ne suis pas certain que ce soit une bonne idée, mais si je devais le faire, j'ajouterais une méthode de classe pour spécifier la valeur des paramètres et je vérifierais à l'entré de cette méthode que la méthode GetInstance n'ait pas déjà été appelée sans quoi je leverais une exception.

    Voilà, en espérant que ça puisse aider

    Jérôme

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Rappel: un singleton, c'est juste une variable globale déguisée pour faire bien en société.
    Donc, tu as aussi le droit de l'initialiser. Pire, si tu veux la construire avec un paramètre, cela veut dire que toute construction paresseuse est impossible.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    En modifiant le mins possible ton code, je dirais comme ça non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class CApp
    {
    private:
    	int m_i1;
    	CApp(int i1): m_i1(i1) {}
    public:
    	static CApp& GetInstance( int i = 0 ) {
    		static CApp s_app( i );
    		return s_app;
    	}
    //Comment faire ...
    };

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Bonjour,

    Niamorh : oui bien sûr, on peut faire comme ça, mais ça m'embette un peu de toujours appeller une fonction avec un argument (par défaut). D'autant plus que dans le cas réel j'en ai 3, dont certains des objets ...

    Ainsi, je pense que je vais utiliser la méthode donnée dans le lien de Luc, qui différencie bien le createInstance(parametres...) et le getInstance(). L'inconvénient, c'est que là, on aura forcément un pointeur sur objet statique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class CApp
    {
    private:
    static CApp* ms_app;
    };
    et un truc trés trés moche dans le cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CApp* CApp::ms_app = NULL;
    alors que dans mon code initial, je n'en avais pas ... juste un objet statique "caché" à l'intérieur d'une seule fonciton statique ...

    Mais bon ... faut bien faire avec.

    @+

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    ... vu ta contrainte/ton exigence, tu n'as pas le choix.

    EDIT:
    Enfin ... Tu pourrais rajouter une indirection (façon pimpl idiom p.ex.) à ton singleton si vraiment tu tiens à tout avoir dans une fonction plutôt qu'en variable (globale) statique de classe.

    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
    struct Singleton {
       Singleton & instance() { // à mettre ailleurs 
          static Singleton s;
          return s;
       }
       void create(params ....) {
          assert(!pimpl_);
          pimpl_ = new Pimpl(params....);
       }
       ...
    private;
       Singleton() : pimpl_(0);
       struct Pimpl { // à mettre ailleurs tant qu'à faire }
       Pimpl * pimpl_;
    };
    Mais franchement, on n'y gagne pas grand chose vu qu'il y a toujours besoin d'une construction explicite. Au lieu d'un Singleton::create(...), il faut appeler Singleton::instance()::create(...).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre Expert

    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
    Par défaut
    Salut,

    Citation Envoyé par olive_le_malin Voir le message
    Mais bon ... faut bien faire avec.
    Ou pas !
    Ou plutôt ou sans (singleton), en gérant correctement les dépendances entre objets (et composants)...

    MAT.
    (membre du comité de soutient à ceux qui font passer des entretiens et à qui on cite spontanément, et avec un grand sourire, le singleton comme exemple de design pattern, soit le cscqfpecsgsscedp ou un truc dans le genre)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    ... vu ta contrainte/ton exigence, tu n'as pas le choix.
    OK, merci Luc

    Ou pas !
    Ou plutôt ou sans (singleton), en gérant correctement les dépendances entre objets (et composants)...
    Mat007, j'utilise ce singleton pour regrouper l'ensemble des fonctions "applicatives", ne faisant partie d'aucune classe, et ne regroupant finalement que des objets / variables / fonctions qui auraient dû être globale. Par exemple, la récupération des paramètres généraux de l'application, fonction d'initialisation, de lancement d'un serveur TCP, ... D'ailleurs, je l'appelle CApp. Que proposes-tu comme alternative ?

    @+

  10. #10
    Membre Expert

    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
    Par défaut
    Citation Envoyé par olive_le_malin Voir le message
    Que proposes-tu comme alternative ?
    Dans un premier temps le plus simple serait de créer cet objet dans le "main" et de le passer directement aux composants/classes qui en ont besoin.
    Je sais bien que le problème c'est que du coup tu vas sans doute devoir le passer en cascade à plein d'autres objets intermédiaires qui ne vont rien en faire que de le passer à leur tour 'plus bas'. C'est d'ailleurs un bon code smell au niveau du processus de création et qui sous-entend un très (trop ?) fort couplage, que justement l'utilisation de variables globales masque, et qui ne se serait vraisemblablement pas produit sans avoir utilisé de singleton en premier lieu.

    Faut pas se voiler la face, comme il a été dit, un singleton c'est une variable globale...

    MAT.

Discussions similaires

  1. Comment passer des paramètre a OpenRecordset
    Par molarisapa dans le forum Access
    Réponses: 2
    Dernier message: 09/03/2006, 17h14
  2. [JSP]Passer des paramètres dynamiques à un Flash
    Par paulo1b dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 27/11/2005, 21h29
  3. [Débutant][C#]Passer des paramètres à un exe
    Par GéniuS77 dans le forum Windows Forms
    Réponses: 13
    Dernier message: 05/07/2005, 16h55
  4. Réponses: 7
    Dernier message: 30/12/2004, 12h01
  5. passer des paramétres à un fichier sql
    Par vbcasimir dans le forum Oracle
    Réponses: 2
    Dernier message: 21/12/2004, 18h08

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