[C++] Map statique dans une classe

Map statique dans une classe [C++] - C++ - Programmation

Marsh Posté le 17-11-2009 à 15:40:08    

Bonjour,
 
Je voudrais utiliser une map statique dans une classe, servant de pointeur sur fonction. Seulement je n'arrive pas à l'initialiser ou à l'utiliser.
J'ai fait ceci:
 

Code :
  1. //Toto.hpp
  2. typedef void(Toto::*cmd)(std::string);
  3. static std::map<std::string, cmd>     cmds;
  4. //Toto.cpp
  5. //Dans le constructeur
  6. if (cmds.empty())
  7. {
  8.   cmds["test"] = &Toto::fonction;
  9. }


 
Il ne se plaint pas lors de la compilation, par contre lors du linkage je me tape des erreurs de ce type:

Citation :

Toto.o: In function `Toto::Toto(boost::asio::io_service& )':
Toto.cpp:(.text+0x1807): undefined reference to `Toto::cmds'
Toto.cpp:(.text+0x1847): undefined reference to `Toto::cmds'


 
Je ne sais pas si la méthode est très propre mais ça m'étonne que je ne puisse même pas accéder à la variable, j'ai oublié quelque chose?


Message édité par Raziel le 17-11-2009 à 15:41:07
Reply

Marsh Posté le 17-11-2009 à 15:40:08   

Reply

Marsh Posté le 17-11-2009 à 15:43:45    

les statiques que tu déclares dans une classe doivent être initialisées (dans ton cpp)


---------------
last.fm
Reply

Marsh Posté le 17-11-2009 à 15:46:57    

et si je pêut me permetre les pointeurs de fonctions c'ets tres 1880. boost::function ets plus mieux :/

Reply

Marsh Posté le 17-11-2009 à 16:30:11    

Joel F a écrit :

et si je pêut me permetre les pointeurs de fonctions c'ets tres 1880. boost::function ets plus mieux :/


 
c'est sur que quand on a la possibilité d'avoir boost, ca doit être pas mal


---------------
last.fm
Reply

Marsh Posté le 17-11-2009 à 16:53:04    

Hum pour l'initialisation dans le cpp, c'est bien quelque chose de ce type?

Code :
  1. //Hpp
  2. typedef std::map<std::string, cmd>    cmd_map;
  3. //Cpp
  4. Toto::cmd_map Toto::cmds(...);


 
Sinon j'ignorais l'existence de boost::function, je jetterai un oeil :jap:

Reply

Marsh Posté le 17-11-2009 à 17:03:01    

juste pour être plus précis sur ce que le code doit être :
 

Code :
  1. // hpp
  2. class Toto
  3. {
  4. // blah
  5.   typedef std::map<std::string, cmd> cmd_map;
  6.   static cmd_map cmds; // declaration
  7. };
  8. // cpp:
  9. Toto::cmd_map Toto::cmds( ... ); // initialisation


 
Lorsque tu déclares une statique dans une classe, tu dois séparer déclaration et initialisation. Pour les globales, tu peux faire les deux en même temps.


---------------
last.fm
Reply

Marsh Posté le 17-11-2009 à 17:15:57    

Ouep c'est ce que j'ai fait. Par contre pour l'initialisation j'ai simplement fait

Code :
  1. //cpp
  2. Toto::cmd_map Toto::cmds;


et j'ai laissé l'ajout des éléments dans le constructeur. Mais il semble possible de les créer dès l'initialisation, c'est possible proprement si la map est statique?

 

Edit: trouvé, merci boost::assign :o


Message édité par Raziel le 17-11-2009 à 17:23:43
Reply

Marsh Posté le 17-11-2009 à 18:42:57    

à ce sujet, d'ailleurs, j'imagine que les listes d'initialisation de C++0x vont venir nous proposer quelque chose de standard sur les maps.


---------------
last.fm
Reply

Marsh Posté le 17-11-2009 à 22:01:48    

pas sur. Je cherche le proposal mais je le trouve pas
http://en.wikipedia.org/wiki/C%2B% [...] izer_lists

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed