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 :

Initialiser une variable static


Sujet :

C++

  1. #1
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut Initialiser une variable static
    bonjour à tous,

    j'ai variable que je veut utiliser pour faire un singleton. mon problème est l'initialisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifdef etc..
     
    class A{
    public:
    static A* instance;
    }
     
    A::instance = NULL
     
    #endif
    mais là j'ai une erreur, je suppose que la syntaxe n'est pas correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C2040: 'instance': les niveaux d'indirection de 'int' et de 'A *' sont differents

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    heu, il manque un ; ... :p

    sinon, ça doit venir de ta définition de l'opérateur "=" apparement, il consider null come un int et pas *A.


    ensuite, je sait pas

    bonne chance

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    1) il manque un ;
    2) il manque le type
    3) il faut la mettre dans le fichier source, pas dans l'entête

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A {
    public:
    	static A* instance;
    };
     
    A* A::instance = NULL;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A {
    public:
    	static A* instance;
    };
     
    A* A::instance = NULL;
    k merci

  6. #6
    Nee
    Nee est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 50
    Par défaut
    Bonjour,

    je profite de se post pour poser une autre question :
    Comment initialiser une variable static dans une function ?
    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
     
    bool switchMe(){
     
       static bool theFlag;
       static int theCounter;
     
       if (theFlag){
          theFlag=false;
       }else{
          theFlag=true;
       }
     
       theCounter++;
     
       return theFlag;
    }
    Puis-je être sur de la valeur initiale de mes variables static (false pour le bool, 0 pour l'int) ?

    Merci.

  7. #7
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Citation Envoyé par Nee
    je profite de se post pour poser une autre question :
    Comment initialiser une variable static dans une function ?
    Et bien tu lui affecte une valeur au moment de sa définition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool switchMe(){   
       static bool theFlag = false;
       static int theCounter = 0;
       //...

  8. #8
    Nee
    Nee est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 50
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    Et bien tu lui affecte une valeur au moment de sa définition.
    Tout simplement. J'avais peur qu'elle soit "réaffectée" a chaque appel.

    Merci!

  9. #9
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Tu n'initialises pas une variable static dans une fonction. Tu déclares son initialisation dans le .cpp, et à l'exécution elle sera en fait mise à cette valeur avant même le début de la fonction main(). Il me semble qu'une variable static est par défaut initialisée à 0 (du moins pour les entiers).

    Il faut toujours redéclarer une variable static en-dehors de la classe, dans le .cpp (seul moyen également de l'initialiser), sauf éventuellement une variable static const, à condition de l'initialiser dans la classe.

    L'intérêt justement des variables statiques est qu'elles sont initialisées une seule fois, et valent pour tout le programme, quels que soient les traitements.

  10. #10
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Noxen, où vois-tu une classe dans son code.
    Il s'agit d'une simple fonction !

    Tu va l'embrouiller !

    Bon c'est vrai qu'il y a deux questions dans le même sujet, donc on ne sait pas a laquel tu repond !

    Si un modérateur pouvait couper ce sujet !

  11. #11
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Tu n'initialises pas une variable static dans une fonction. Tu déclares son initialisation dans le .cpp, et à l'exécution elle sera en fait mise à cette valeur avant même le début de la fonction main().
    +1.
    Citation Envoyé par Noxen Voir le message
    Il me semble qu'une variable static est par défaut initialisée à 0 (du moins pour les entiers).
    Ah bon?
    Citation Envoyé par Noxen Voir le message
    L'intérêt justement des variables statiques est qu'elles sont initialisées une seule fois, et valent pour tout le programme, quels que soient les traitements.
    Sauf si elles ne sont pas constantes.

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    J'ai jamais compris pourquoi les gens n'utilisaient pas cette technique pour faire un singleton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Singleton
    {
        static Singleton& instance()
        {
            static Singleton singleton;
            return singleton;
        }
     
    private:
         Singleton() { /* ce que tu veux */ }
     
         Singleton(const Singleton&);
         Singleton& operator=(const Singleton&);
    };
    C'est simple, élégant, thread-safe...

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Qu'est-ce qui est thread-safe exactement ?
    L'initialisation de variable statique dans une fonction ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par loufoque Voir le message
    J'ai jamais compris pourquoi les gens n'utilisaient pas cette technique pour faire un singleton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Singleton
    {
        static Singleton& instance()
        {
            static Singleton singleton;
            return singleton;
        }
     
    private:
         Singleton() { /* ce que tu veux */ }
     
         Singleton(const Singleton&);
         Singleton& operator=(const Singleton&);
    };
    C'est simple, élégant, thread-safe...
    Ben si... c'est ce que je fais tout le temps.... Sauf pour les singletons dynamiques (dont la classe est définie au runtime)...

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Oui.
    C'est thread-safe dans C++0x et dans GCC.

    Sauf pour les singletons dynamiques (dont la classe est définie au runtime)...
    Une classe ne peut pas être définie à l'exécution. Ça ne veut absolument rien dire.
    Je rappelle qu'une variable statique dans une fonction est initialisée au premier appel de celle-ci. Contrairement à une variable statique dans une classe qui est initialisée au lancement du programme.

  16. #16
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    Noxen, où vois-tu une classe dans son code.
    Il s'agit d'une simple fonction !

    Tu va l'embrouiller !

    Bon c'est vrai qu'il y a deux questions dans le même sujet, donc on ne sait pas a laquel tu repond !

    Si un modérateur pouvait couper ce sujet !
    Toutes mes excuses, effectivement j'avais mal interprété sa question

    Une variable static au sein d'une fonction est instanciée au premier appel de la fonction.

    Citation Envoyé par spoutspout Voir le message
    Sauf si elles ne sont pas constantes.
    Je me suis mal exprimé, je voulais dire que la variable elle-même, instanciée, continue à exister dans l'ensemble du programme, bien que sa valeur puisse évoluer si elle n'est pas constante, bien sûr.

    Pour l'initialisation à 0, si, je l'avais lu, et j'avais vérifié (sous visual), mais seulement pour les variables, les constante doivent être initialisées, même si c'est à 0 ; par contre, je doute que ça fasse partie de la norme.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/04/2006, 16h03
  2. Réponses: 6
    Dernier message: 04/04/2006, 13h12
  3. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  4. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 13h36
  5. Réponses: 9
    Dernier message: 29/06/2004, 08h40

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