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 un static map


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut initialiser un static map
    bonjour,

    Comme l'explique le titre je voudrais initialiser un static map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     static std::map<T1,T2> conteneur_map;
    Je voudrais qu'il soit vide au départ.

    J'ai trouvé des doc et autres dessus mais je n'ai rien compris...

    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut static, ou static?
    Citation Envoyé par Plomeg Voir le message
    Comme l'explique le titre je voudrais initialiser un static map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     static std::map<T1,T2> conteneur_map;
    Je voudrais qu'il soit vide au départ.
    Il y a static et static. static comment?
    • variable statique déclarée à portée globale?
    • variable statique déclarée dans une fonction?
    • membre statique d'une classe?

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Plomeg Voir le message
    Je voudrais qu'il soit vide au départ
    Le constructeur d'un map fait qu'il est vide au départ
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 11
    Par défaut
    Si la map est un membre statique d'une classe - elle sera vide par défaut - mais il me semble que la solution la plus 'sûre' serait de créer un couple de fonctions qui initialise et de-initialise la partie statique de la 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    class A
    {
      static bool ms_bInitialised = false;
      static std::map<T1,T2> conteneur_map;
      static void sInit();
      static void sClose();
    }
    static void A::sInit()
    {
        if(!ms_bInitialised)// à remplacer par un assert si nécessaire
        {
           conteneur_map = std::map<T1,T2>();
           ms_bInitiliased = true;
        }
     
    }
    static void A::sClose()
    {
     
        if(ms_bInitialised)// à remplacer par un assert si nécessaire
        {
           conteneur_map.clear();
           ms_bInitiliased = false;
        } ;
    }
    Il faudrait donc appeler la fonction sInit avant d'instancer la classe et appeler sClose en fin de programme ou lorsque la classe n'est plus utile.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par vimes Voir le message
    Si la map est un membre statique d'une classe - elle sera vide par défaut - mais il me semble que la solution la plus 'sûre' serait de créer un couple de fonctions qui initialise et de-initialise la partie statique de la 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    class A
    {
      static bool ms_bInitialised = false;
      static std::map<T1,T2> conteneur_map;
      static void sInit();
      static void sClose();
    }
    static void A::sInit()
    {
        if(!ms_bInitialised)// à remplacer par un assert si nécessaire
        {
           conteneur_map = std::map<T1,T2>();
           ms_bInitiliased = true;
        }
     
    }
    static void A::sClose()
    {
     
        if(!ms_bInitialised)// à remplacer par un assert si nécessaire
        {
           conteneur_map.clear();
           ms_bInitiliased = false;
        } ;
    }
    Pourquoi plus sûr?

    Tu penses que le constructeur par défaut et le destructeur de std::map sont bugués?

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par vimes Voir le message
    Si la map est un membre statique d'une classe - elle sera vide par défaut - mais il me semble que la solution la plus 'sûre' serait de créer un couple de fonctions qui initialise et de-initialise la partie statique de la classe.
    Plus sûr : non
    plus propre : peut être.

    Cela a au moins le mérite de faire (et de demander au développeur ?) un appel explicite mais cela n'apporte rien de plus.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Plus sûr : non
    plus propre : peut être.
    En quoi c'est plus propre?

    Citation Envoyé par ram_0000 Voir le message
    Cela a au moins le mérite de faire (et de demander au développeur ?) un appel explicite mais cela n'apporte rien de plus.
    En gros on créé une contrainte sur l'utilisation de la map; pourquoi?

  8. #8
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 11
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Plus sûr : non
    plus propre : peut être.
    Cela a au moins le mérite de faire (et de demander au développeur ?) un appel explicite mais cela n'apporte rien de plus.
    Tu as raison : en fait, je voulais dire que c'était plus sûr en terme de developpement.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut
    désolé pour la précision mais c'est bien static de classe, donc à initialiser à l'extérieur sinon erreur de linker (c'est mon cas). Il faudrait donc faire quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<T1,T2> ClasseProprietaire::conteneur_map =  "quelque chose";//en dehors de la classe
    Enfin je crois. Je pense qu'il faudrait créer un map du même type et faire égal (mais j'ai tester et ça ne veut pas non plus).

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut variable static membre
    Citation Envoyé par Plomeg Voir le message
    désolé pour la précision mais c'est bien static de classe, donc à initialiser à l'extérieur sinon erreur de linker (c'est mon cas). Il faudrait donc faire quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<T1,T2> ClasseProprietaire::conteneur_map =  "quelque chose";//en dehors de la classe
    Enfin je crois. Je pense qu'il faudrait créer un map du même type et faire égal (mais j'ai tester et ça ne veut pas non plus).
    Non, il suffit de la définir à l'extérieur de la classe (une seule fois dans le programme) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // dans ClasseProprietaire.cpp :
    std::map<T1,T2> ClasseProprietaire::conteneur_map; 
    // initialisation par défaut (vide)
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::map<T1,T2> ClasseProprietaire::conteneur_map = une_autre_map; 
    // initialisation par recopie
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::map<T1,T2> ClasseProprietaire::conteneur_map (debut, fin); 
    // initialisation avec la range [debut, fin)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut
    trop simple pour y penser^^. Je ne sais pas pourquoi mais en mettant la définition juste après la classe, le compilo considérait ça comme une déclaration. En fait il suffisait de le déplacer dans le .cpp mais je ne sais pas pourquoi. En attendant :

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Plomeg Voir le message
    trop simple pour y penser^^. Je ne sais pas pourquoi mais en mettant la définition juste après la classe, le compilo considérait ça comme une déclaration.
    Bien sûr, par définition toute définition est aussi une déclaration.

    Blague à part (je vois ce que tu veux dire!), je crois que tu te trompes.

    Citation Envoyé par Plomeg Voir le message
    En fait il suffisait de le déplacer dans le .cpp mais je ne sais pas pourquoi. En attendant :
    Le compilateur proprement dit[1] ne fait pas la différence : il ne voit qu'une série de déclarations, il n'a aucun idée si tu les as mises dans un en-tête ou dans un .cpp.

    La différence, c'est si tu inclus un en-tête à plusieurs endroits, son contenu se trouve dupliqué.

    Le préprocesseur est juste ça : un outil pour dupliquer des déclarations de façon adéquate.

    [1] techniquement : phase 7 de la traduction,

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par corrector Voir le message
    En quoi c'est plus propre?



    En gros on créé une contrainte sur l'utilisation de la map; pourquoi?
    Parce que je n'aime faire le nettoyage de manière implicite par le destructeur. J'aime bien le faire de manière explicite. Peut être une habitude que j'ai prise du C.

    Bon, c'est sur que dans ce cas, il y a la méthode map.clear() qui fait la même chose (et qui est certainement appelée par le destructeur)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Parce que je n'aime faire le nettoyage de manière implicite par le destructeur. J'aime bien le faire de manière explicite.
    Oui, mais pourquoi?

    Citation Envoyé par ram_0000 Voir le message
    Peut être une habitude que j'ai prise du C.
    Est-ce encore pertinent en C++?

    Citation Envoyé par ram_0000 Voir le message
    Bon, c'est sur que dans ce cas, il y a la méthode map.clear() qui fait la même chose (et qui est certainement appelée par le destructeur)
    Peut-être, mais pas forcément : clear() a une post-condition (exprimée en terme de *this), le destructeur non, par définition.

  15. #15
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 11
    Par défaut
    Je ne suis pas sûr que je vais être clair, mais sInit/sClose permet aussi d'encapsuler la logique de la classe de manière plus visible. Par exemple, si tu avais une map de pointeurs plutôt qu'une map d'objets,seuls l'implémentation de sInit et de sClose permettrait de traiter les deux cas suivant :
    - ta classe est propriétaire du contenu de la map et doit désallouer le contenu avant de sortir
    - ta classe n'est pas propriétaire du contenu de la map et elle ne fait que vider la map.
    Ce sont des garde-fous pas forcément nécessaires mais qui rendent le code plus maintenable à mon avis.

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par vimes Voir le message
    Par exemple, si tu avais une map de pointeurs plutôt qu'une map d'objets,seuls l'implémentation de sInit et de sClose permettrait de traiter les deux cas suivant :
    - ta classe est propriétaire du contenu de la map et doit désallouer le contenu avant de sortir
    Tu peux faire ce nettoyage dans le destructeur d'un (autre) objet statique, justement.

    (Tu peux aussi utiliser boost dans ce cas, mais je suppose que c'est seulement un exemple.)

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

Discussions similaires

  1. initialiser à vide une map static
    Par freestyler1982 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 25/09/2014, 10h38
  2. [FPDF] Static map google
    Par Darkcristal dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 22/03/2010, 16h46
  3. Insérer une image "dynamique" google Static Maps
    Par lusitano11 dans le forum Jasper
    Réponses: 3
    Dernier message: 03/09/2009, 14h28
  4. [debutant] initialisation variable static
    Par julien.63 dans le forum Langage
    Réponses: 3
    Dernier message: 12/01/2008, 18h02
  5. initialisation d'une map et d'un iterator
    Par petitmic dans le forum C++
    Réponses: 2
    Dernier message: 12/04/2006, 23h22

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