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 d'un membre static


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut initialisation d'un membre static
    Salut,

    j'ai un problème avec un membre static d'un classe, je pense que je comprend pas exactement comment ça marche. voici mon code:
    une classe A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Sprite_Manager{
     
        public:
     
            //constructeur par default
            Sprite_Manager();
     
            //destructeur
            ~Sprite_Manager();
     
    };
    une classe B qui a un membre static de A
    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
    class Drawable{
     
        private:
     
            //le sprite manager commun a tous les drawables
            static Sprite_Manager sprite_manager;
     
        public:
     
            //constructeur par default
            Drawable();
     
            //destructeur
            ~Drawable();
     
    };
    et je met ça au debut de drawable.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sprite_Manager Drawable::sprite_manager = Sprite_Manager();
    pourtant le code que j met dans le constructeur n'est pas exécuté, je n'est troué que des exemples avec des static int initialisés comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int classA::entier = 0;
    y'a t'il une erreur dans mon code? j'aimerai eviter d'utiliser une autre méthode du genre sprite_manager.init(); peut etre est-ce impossible?

    merci d'avance

  2. #2
    screetch
    Invité(e)
    Par défaut
    ton code a l'air correct et je pense qu'il fonctionne, tu es sur que le constructeur n'est pas appelé ? as tu essayé de mettre un "printf" ou un "OutputDebugString" dedans pour voir ?
    ce code est (devrait être) executé avant main
    le compilateur a aussi peut etre décidé de l'inliner

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    le constructeur commence par un fprintf(stderr,"sprite manager initialisé\n"); et stderr reste vide.

    Je ne voit pas ou peut s'afficher le Hello de OutputDebugString("Hello"); dans codeblocks, un indice?

    edit:
    J'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        FILE* plop = fopen("test","w");
        fclose(plop);
    dans mon code pour vérifier au cas ou le fprintf ne marche pas, et le fichier est bien créé, donc le constructeur est bien appelé, le problème doit venir du fait que stderr n'était pas encore initialisé...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    et avec un std::cout?

    Sinon je pense que tu peux mettre juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sprite_Manager Drawable::sprite_manager;

  5. #5
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    et avec un std::cout?
    Ca peut être le même problème. Tu pourras toujours avoir un fiasco dans l'ordre d'initialisation.
    Le seul vrai moyen est de construire explicitement et dans l'ordre que tu le souhaites au début du main par un monteur de singleton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
     // monter les singletons/variables globales
     [...]
     // déroulement du programme
     [...]
     // démonter les singletons
       return 0;
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    mis à part pour le problème de fprintf le fiasco n'a pas trop d'importance ici? non?

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    il me semble avoir lu que le std::cout n'était pas concerné par ce problème de fiasco

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

Discussions similaires

  1. Initialisation de membre static
    Par Derfh dans le forum C++
    Réponses: 3
    Dernier message: 02/12/2014, 08h47
  2. Initialisation variable membre static const double
    Par LinuxUser dans le forum C++
    Réponses: 27
    Dernier message: 04/01/2013, 10h05
  3. Initialisation d'un membre static const
    Par la_urre dans le forum Langage
    Réponses: 4
    Dernier message: 07/10/2010, 10h31
  4. Initialisation de membres static const
    Par NiamorH dans le forum C++
    Réponses: 16
    Dernier message: 14/01/2008, 16h50
  5. Réponses: 5
    Dernier message: 09/12/2007, 00h16

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