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 :

Initialisation de "static const" dans m�thode static ?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par d�faut Initialisation de "static const" dans m�thode static ?
    Bonjour,

    Je d�veloppe actuellement un applicatif que je veux configurer � l'aide d'un fichier XML.

    En fait j'ai une classe qui ressemble � celle-ci :
    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
    class MaClasse {
     
    private:
    	static const float MON_FLOAT;
     
    public:
    	static const int MON_INT;
     
    	/**
             * Constructeur
             */
    	MaClasse();
     
    	/**
             * Destructeur
             */
    	~MaClasse();
     
    	/**
             * Initialise les constantes globales des instances de la classe MaClasse.
             * @param mon_float un flottant
             * @param mon_int un entier
             */
    	static void initMesClasses(const float mon_float, const int mon_int);
    };
    Mon but est d'initialiser MON_INT et MON_FLOAT � l'aide de la m�thode static initMesClasses().
    J'ai donc tout naturellement tent� une affectation dans cette m�thode. Du style :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    MaClasse::MON_INT = mon_int;
    Malheureusement cela ne fonctionne pas. :/ En gros le compilo me dit que je ne peux pas modifier la valeur d'un "const". Cela me parait tout � fait logique, hormis le fait que je n'ai jamais initialis� la constante en question...

    Donc ma question est : est-ce possible ? Puis-je initialiser mes constantes depuis une methode static ? Si non, quel moyen me permettrait d'initialiser mon appli au d�but de son ex�cution (� partir de mon fichier XML) ?

    Merci et bonne journ�e. :]

  2. #2
    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,

    Si ce sont des constantes, il faut que tu initialise les valeurs une bonne fois pour toutes...

    cela donnera quelque chose comme:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MaClass
    {
        private:
            static const float monFloat;
        public:
            static const int monInt,
    };
    /* dans le *.cpp */
    const float MaClass::monFloat = 3.1415926;
    const int MaClass::monInt=153;
    Si tu veux pouvoir modifier les valeurs, tu n'a pas le choix, tu dois utiliser des valeurs non constantes, et, si tu souhaites �viter que "n'importe qui" n'aille les modifier, il faudra fournir un accesseur sur celles-ci.

    Cela pourrait prendre la forme de
    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
    class MaClass
    {
        private:
            friend class reader; // permet à la classe reader uniquement de 
                                // modifier les valeurs ;)
            static float monFloat_;
            static int monInt_,
        public:
            static float monFloat(){return monFloat_;}
            static int monInt(){return monInt_;}
    };
    /* dans le *.cpp */
    /* on fournit des valeur "par défaut", pour le cas où la configuration ne
     * les changerait pas 
     */
    float MaClass::monFloat = 3.1415926;
    int MaClass::monInt=153;
    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

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par d�faut
    Ok c'est not�. Je prendrai donc la seconde solution. C'est dommage, j'esp�rais en avoir une plus �l�gante. :/

    Merci. :]

  4. #4
    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
    Le fait est que les valeurs constantes sont, par d�finition, immuables...

    Tu ne peux donc d�cemment pas envisager de d�clarer une valeur comme immuable et... vouloir �tre en mesure de la modifier en m�me temps
    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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par d�faut
    Oui je comprends bien... Maintenant j'aurais �galement compris qu'une constante soit... constante justement... mais apr�s sa premi�re initialisation (parce qu'une constante sans valeur ne sert - a priori - � rien).

  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
    Si ce n'est que tu dois initialiser les constantes au moment de leur d�finition, vu que tu ne peux plus les modifier une fois qu'elles ont �t� cr��s...

    Et, comme, de plus, il s'agit de valeur statiques, donc, ind�pendantes de toute instance de ta classe, elles sont susceptible d'exister alors qu'il n'y a encore aucune instance de ta classe qui a �t� cr��e, ce qui fait que tu ne peux de toutes mani�res pas attendre que l'on passe dans le constructeur pour les initialiser

    N'oublie pas qu'une variable statique n'est en d�finitive qu'une variable globale qui se trouve, simplement, dans une port�e particuli�re (du moins, quand c'est un membre de classe)
    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

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 15/06/2008, 18h31
  2. MediaTracker dans m�thode static
    Par Siron dans le forum Langage
    R�ponses: 1
    Dernier message: 19/02/2008, 13h49
  3. R�ponses: 2
    Dernier message: 30/10/2006, 16h40
  4. R�ponses: 16
    Dernier message: 26/10/2006, 16h17

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