vecteur de string static

vecteur de string static - C++ - Programmation

Marsh Posté le 23-12-2005 à 11:59:19    

Bonjour,
 
Je désire faire un vecteur de string de type static pour ne pas devoir l'initialiser à chaque appel de classe, mais je suis bloqué en compilation.
 
Extrait de codes:
1. Fichier cl_date.h

Code :
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. class cl_date{
  5. private
  6.   const static vector <string> v_mois;
  7. };


 
2. Fichier cl_date.cpp

Code :
  1. #include "date.h"
  2. cl_date::v_mois.push_back("Janvier" );
  3. ... etc


 
Mais voila, ça veut pas compiler si c'est un vecteur de string
J'ai tenté le même raisonnement via un tableau de string, soit

Code :
  1. const string A_mois[12];


initialisé par

Code :
  1. A_mois = {"Janvier"};


et rebollote  :non:  
 
Quelqu'un aurait-il une bonne idée pour n'avoir qu'une seule initialisation (vector ou array) valable pour toutes les instantiations (d'où le static)
 
Merci d'avance
 
  L.

Reply

Marsh Posté le 23-12-2005 à 11:59:19   

Reply

Marsh Posté le 23-12-2005 à 12:53:24    

Citation :


Mais voila, ça veut pas compiler si c'est un vecteur de string  


 
Alors là, mes pouvoirs d'ESP sont en rade ...
J'aimerais bien voir le message d'erreur [:dawa]
 
 
Mais bon, de têtes , tu peut pas avoir de const static qui ne sotn pas des types de bases.

Reply

Marsh Posté le 23-12-2005 à 13:38:01    

c'est plutôt que la fonction d'ajout d'un élément dans un vecteur n'est pas une méthode const du vecteur et ne peut donc pas être appliquée à un vecteur constant qu'il soit statique ou non
 
Edit :
 
ce que tu voudrais, toi, c'est juste un vecteur statique, donc :
 
Foo.h :

Code :
  1. class Foo {
  2. static std::vector<std::string> chaines;
  3. };


Foo.cpp :

Code :
  1. #include "Foo.h"
  2. std::vector<std::string> Foo::chaines(3, "Bar" )


 
et tu auras ton vecteur statique initialisé avec trois chaines contenant "Bar"
 
 
Edit 2 :
dans ton cas, plus précisément, tu voudras sans doute faire l'initialisation comme suit :

Code :
  1. const static char * const mois[] = {
  2.     "janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "decembre"
  3. };
  4. std::vector<std::string> Foo::chaines(&mois[0], &mois[12]);


 
Edit 3 : correction mineure :o


Message édité par theshockwave le 23-12-2005 à 13:51:55
Reply

Marsh Posté le 23-12-2005 à 13:53:09    

Joel F a écrit :

Mais bon, de têtes , tu peut pas avoir de const static qui ne sotn pas des types de bases.


(juste au passage : c'est totalement faux)

Reply

Marsh Posté le 23-12-2005 à 13:56:08    

Merci pour cette réponse, mais dans ce cas, j'ai 3 elements identiques, mais bon ...
 
Si je met un vectur static dans le H

Code :
  1. static vector <string> V_mois;


 
Et dans le CPP

Code :
  1. // init vector
  2. V_mois.push_back("Janvier" );


 
Compilation du CPP : OK
 
Création d'un autre CPP pour inclure le traitement et l'appel de classe :
- Compilation OK
- [Linker error] undefined reference to 'cl_date::v_mois'
 
Donc, je soupsonne que le static vector <string> v_mois; n'est pas très top  :pfff:  
 
Une autre suggestion peut-être

Reply

Marsh Posté le 23-12-2005 à 13:59:08    

edit :  
et si tu liais tes deux fichiers ensembles ? [:dawa]


Message édité par theshockwave le 23-12-2005 à 14:00:26
Reply

Marsh Posté le 23-12-2005 à 14:03:11    

Je suis contraint à faire:
- un H pour definition
- un CPP pour le code
- un CPP pour l'application
 
Le tout est lié, les obj inclus
 
Si je mets en commentaire les vecteurs problematiques, ça roule ...

Reply

Marsh Posté le 23-12-2005 à 14:04:27    

dans ce cas, tu n'as pas mis la ligne -obligatoire- d'initialisation comme je l'ai précisé dans mes exemples :o
 
Edit :
si tu veux laisser ton tableau à vide, il faut tout de même mettre ca dans ton Foo.cpp :

Code :
  1. std::vector<std::string> Foo::chaines;


Message édité par theshockwave le 23-12-2005 à 14:05:26
Reply

Marsh Posté le 23-12-2005 à 14:15:08    

OK ça marche bien si je fait une initialisation depuis le char *
 
Merci beaucoup

Reply

Marsh Posté le 23-12-2005 à 16:34:31    

theshockwave a écrit :

(juste au passage : c'est totalement faux)


 
mon gcc 3.4 me chouine la dessus :

Code :
  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4. class Truc
  5. {
  6.   public:
  7.   static const string toto = "baba";
  8. };
  9. int main(int,char**)
  10. {
  11. cout << Truc::toto << endl;
  12. }


 


joel@upnaphistim> g++ test.cpp -o testorz
test.cpp:9: error: invalid in-class initialization of static data member of non-integral type `const std::string'


Reply

Marsh Posté le 23-12-2005 à 16:34:31   

Reply

Marsh Posté le 23-12-2005 à 16:39:00    

normal. et il te dit même pourquoi à juste titre.

Reply

Marsh Posté le 23-12-2005 à 16:39:35    

soit donc je vois pas pourquoi theshockwave me dis que j'ai tord :o

Reply

Marsh Posté le 23-12-2005 à 16:40:37    

type entier c'est bon, mais pas les autres types de base

Reply

Marsh Posté le 23-12-2005 à 16:41:44    

j'avais a demi tord [:cupra] ?

Reply

Marsh Posté le 23-12-2005 à 16:53:30    

Code :
  1. #include <vector>
  2. #include <string>
  3. class Calendar
  4. {
  5. public:
  6.   static const std::vector<std::string> months()
  7.   {
  8.     const char * const c_months[] = { "January", "December" };
  9.     static std::vector<std::string> cpp_months(c_months, c_months + 2);
  10.     return cpp_months;
  11.   }
  12. };
  13. int main()
  14. {
  15.   Calendar::months();
  16. }


 
moi j'aurais fait comme ça de toutes façons.

Reply

Marsh Posté le 27-12-2005 à 10:18:35    

Joel F a écrit :

soit donc je vois pas pourquoi theshockwave me dis que j'ai tord :o


Code :
  1. #include <iostream>
  2. #include <string>
  3. struct Foo {
  4.     const static std::string BAR;
  5. };
  6. const std::string Foo::BAR = "Foo::BAR";
  7. int main()
  8. {
  9.     std::cout << Foo::BAR << std::endl;
  10. }


 
Dans ce cas, l'initialisation de la donnée doit être séparée de sa déclaration

Reply

Sujets relatifs:

Leave a Replay

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