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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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
    .

  9. #9
    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.

  10. #10
    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.

  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
    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).

  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 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)

+ 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