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

SL & STL C++ Discussion :

problème avec map statique


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut problème avec map statique
    Bonjour à tous,

    ayant pris conscience que j'avais quelques lacunes concernant le mot clé static, j'ai voulu tenter quelque chose:

    Je voudrais avoir une classe qui m'encapsule une map. Cette map sera statique et sera initialisée une fois. Cette map fera le lien entre un type de terrain et un string correspondant au path d'un fichier. Ainsi, n'importe où dans mon application, je pourrais récupérer le chemin du fichier en fonction du type de terrain.

    Voici le code:
    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
    27
    28
    29
    30
    31
    // ------------------------------
    enum GroundType
    {
    	GRASS,
    	MUD,
    };
     
    // ------------------------------
    class GroundTypeMap
    {
    public:
    	GroundTypeMap(){}
    	~GroundTypeMap(){}
     
    	static void init()
    	{
    		m_map[GroundType::GRASS] = "c:\\temp\\grass.bmp";
    		m_map[GroundType::MUD] = "c:\\temp\\mud.bmp";
    	}
     
    private:
    	static std::map<int, std::string> m_map;
    };
     
    // ------------------------------
    class Manager
    {
    public:
    	Manager(){GroundTypeMap::init();}
    	~Manager();
    };
    Et j'obtiens tout un tas d'erreur de lien que je ne comprend pas:
    Erreur 1 error LNK2019:
    symbole externe non résolu "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char, struct std::char_traits<char>, class std::allocator<char> >::operator= (char const *)" (__imp_??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) référencé dans la fonction "public: static void __cdecl GroundTypeMap::init(void)" (?init@GroundTypeMap@@SAXXZ) R_PNGManager.obj
    ou encore:
    Erreur 2 error LNK2001: symbole externe non résolu "private: static class std::map<int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<int>,class std::allocator<struct std::pair<int const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > GroundTypeMap::m_map" (?m_map@GroundTypeMap@@0V?$map@HV?$basic_string@DU?$char_traits@D@std@ @V?$allocator@D@2@@std@@U?$less@H@2@V?$allocator@U?$pair@$$CBHV?$basic_string@DU?$char_traits@D@std@ @V?$allocator@D@2@ @std@@@std@@@2@@std@@A) R_PNGManager.obj
    J'ai remarqué également que si je supprime l'appel à GroundTypeMap::init(); la compilation réussit, même si je laisse la définition de cette méthode init.

    Est-ce que vous avez une idée de ce qu'il se passe ici?

    ps: je sais, il faudra que je rajoute un mécanisme pour s'assurer que la classe ne soit initialisée qu'une fois, et surtout, qu'on ne puisse pas l'utiliser si elle n'est pas initialisée.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Il indique qu'il n'arrive pas à trouver la variable dans ton code.
    A un endroit, tu dois avoir un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<int, std::string> GroundTypeMap::m_map;
    Et aussi http://c.developpez.com/faq/cpp/?pag..._static_erreur

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Je comprend pas, ça ne fonctionne pas. Je vais me renseigner plus avant, je reviendrais vous dire quoi quand j'en saurais plus, et que j'aurais enfin compris quelque chose à ce static.

    static, c'est le diable.

  4. #4
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Tu cherches à faire un singleton d'une classe qui encapsule une map ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par r0d
    Je comprend pas, ça ne fonctionne pas. Je vais me renseigner plus avant, je reviendrais vous dire quoi quand j'en saurais plus, et que j'aurais enfin compris quelque chose à ce static.

    static, c'est le diable.
    Meuh nan :p

    De manière succinte, une variable ou méthode déclarée static dans une classe te permet de pouvoir accéder à cette variable sans avoir besoin de créer une instance de cette classe (bon je sais j'enfonce un peu des portes ouvertes désolé).

    Excepté pour le cas d'une constante entière, sa déclaration NE PEUT PAS SERVIR de définition. Il faut donc la rajouter quelque part, comme l'a dit Miles.

    Maintenant si tu ne définis pas cette variable que se passe-t-il ?

    Dans un premier temps, le compilateur vérifie que la syntaxe est correcte. Dans ton cas, elle l'est donc pas d'erreur à ce niveau là.

    Ensuite deux solutions : soit tu utilises cette variable dans ton programme, de manière directe ou via un appel à une fonction l'utilisant ; dans ce cas le compilteur tente de résoudre le lien vers le symbole (ici cela pose problème, car bien que ta variable soit déclarée, elle n'est jamais définie) ; soit tu ne l'utilises pas et dans ce cas-là aucune résolution n'est tentée. C'est pour cela que ton code compile lorsque tu n'appelles pas ta méthode init.

    En rajoutant le code de Miles, quelle erreur obtiens tu ?

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bon ok, j'ai trouvé, c'était à cause de l'option /NODEFAULTLIB qu'il y a avait des problèmes de lien. Pourquoi? Je n'en sais fichtre rien, certainement un problème de link avec la SL...


  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Pour moi une variable statique n'est pas commune aux objets. C'est une vision à rebrousse poils de la mienne.

    Une variable statique n'est qu'une variable globale qui existe dans une portée particulière. Ce qui permet de la coupler plus fortement avec les objets de la classe de même nom -- quand il y en a, ce qui est très loin d'être nécessaire.
    Ha, et on peut également leur donner une visibilité et donc de disposer d'un semblant d'encapsulation.

    Ce n'est que ma vision des choses.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Application avec map statique
    Par hamdouch89 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 23/04/2012, 17h07
  2. Overflow avec tableau statique
    Par oxor3 dans le forum C++
    Réponses: 2
    Dernier message: 23/12/2005, 06h42
  3. [PERL] Problème avec map
    Par LE NEINDRE dans le forum Langage
    Réponses: 9
    Dernier message: 05/10/2005, 09h48
  4. Réponses: 2
    Dernier message: 19/08/2005, 16h02
  5. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10

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