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 :

problème lecture variable static d'un singleton


Sujet :

Langage C++

Vue hybride

totoscill problème lecture variable... 24/07/2009, 08h20
ymoreau Je ne vois pas où serait le... 24/07/2009, 10h28
totoscill Merci, Petite erreur de... 24/07/2009, 10h44
3DArchi Salut, Pourquoi ne pas tirer... 24/07/2009, 14h21
totoscill J'ai essayé quelque chose... 24/07/2009, 16h33
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut problème lecture variable static d'un singleton
    Bonjour,

    Je rencontre un problème pour lire une variable statique de ma classe singleton "model".
    En effet dans cette classe, je declare:

    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public:
    static int maVariable;
    int getVariable()
    void setVariable(int *p_varaible)
    .c:
    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
     
    int maVariable;
     
    int model::getVariable()
    {
       return maVariable;
    }
     
    void model::setVariable(int *p_varaible)
    {
       maVariable = *p_variable;
    }
     
    model* model::getInstance()
    {
    	if ( NULL == instance )
    	{
    		instance =  new model();
    	}
    	return instance;
    };
    Jusque la, aucun problème. Mon constructeur et destructeur sont bien privé et mon instance n'est créée qu une seule fois (principe du singleton).

    Le problème est lors de l'accès à ma variable. Lorsque j'initialise ma variable dans une classe donnée et que je lis cette même variable dans la même classe, aucun problème. Le problème est lorsque je veux relire la variable initialisée dans la classe précédente dans une autre classe, model::getVariable() retourne "0". Je recupère bien l'instance avant d'accéder à ma variable dans l'autre classe avec getInstance().

    J'ai essayé avec une variable "en dur" dans ma classe et pas de problème (ce qui est normale).

    Je veux accéder à cette variable dans n'importe quelle classe de mon projet d'où cette question:

    Le singleton est il bien fait pour ce type de problème?

    Est il préférable d'utiliser un segment commun (dataseg) pour ce type de problème?

    D'où pourrait venir le problème?

    Je vous remercie.

  2. #2
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Je ne vois pas où serait le problème désolé.

    Par contre, petite critique : l'idée d'un objet singleton est qu'il soit instancié une seule fois et qu'il soit accessible de n'importe grâce à la fonction statique getInstance(). Du coup on a bien une instance de classe (même si elle est unique), alors que tu utilises une variable statique pour maVariable, puisque ta classe est instanciée tu devrais utiliser une donnée membre normale et pas statique.

    Edit : je viens de voir que tu redéclares ta variable maVariable dans ton .cpp ! J'imagine que tu voulais l'initialiser, mais pour bien faire appel à ta donnée membre statique il faut préciser qu'elle vient de ta classe. Tel qu'il est ton code déclare une variable globale au .cpp qui porte le même nom que ta variable de classe, il est probable qu'il y ait confusion.
    Tu devrais mettre dans .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int model::maVariable = 0;
    Mais je pense quand même qu'il vaut mieux utiliser une donnée membre normale plutôt que statique, que tu initialiserais dans ton constructeur.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    Citation Envoyé par YoniBlond Voir le message
    Edit : je viens de voir que tu redéclares ta variable maVariable dans ton .cpp ! J'imagine que tu voulais l'initialiser, mais pour bien faire appel à ta donnée membre statique il faut préciser qu'elle vient de ta classe. Tel qu'il est ton code déclare une variable globale au .cpp qui porte le même nom que ta variable de classe, il est probable qu'il y ait confusion.
    Tu devrais mettre dans .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int model::maVariable = 0;
    Merci,

    Petite erreur de frappe, je déclare bien ma variable de cette façon.
    Je vai voir ce que ça donne en la passant en membre normal plutot que statique.

  4. #4
    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
    Par défaut
    Salut,
    Pourquoi ne pas tirer profit des références et utiliser le const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int getVariable() const;
    void setVariable(int const &r_varaible);
    model& getInstance();

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Pourquoi ne pas tirer profit des références et utiliser le const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int getVariable() const;
    void setVariable(int const &r_varaible);
    model& getInstance();
    J'ai essayé quelque chose comme ça mais sans effet. Je retest ça dès que possible. Merci.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    J'ai retravailler sur ce problème. Le problème viens du fait que je fais appel au singleton dans des process différent d'ou le problème d'accès à la variable puisque les process ont chacun leur propre zone mémoire.

    Etes vous d'accord?

    Si oui on peut dire que le problème au résolu. Je vais partager une zone mémoire pour resoudre le problème.

Discussions similaires

  1. Singleton ou variables statics """global""" ?
    Par base-un dans le forum Langage
    Réponses: 16
    Dernier message: 27/11/2010, 04h10
  2. [Singleton] question sur variable static
    Par ultimax dans le forum Langage
    Réponses: 6
    Dernier message: 13/01/2010, 11h43
  3. Problème avec une variable static
    Par Kevin12 dans le forum Général Java
    Réponses: 2
    Dernier message: 05/05/2008, 17h20
  4. Problème de variable en lecture XML en AS2.0
    Par blanchonvincent dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 17/01/2008, 20h33
  5. Réponses: 6
    Dernier message: 12/09/2007, 17h31

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