Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1480 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  vecteur de string static

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

vecteur de string static

n°1272374
liba
Posté le 23-12-2005 à 11:59:19  profilanswer
 

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.

mood
Publicité
Posté le 23-12-2005 à 11:59:19  profilanswer
 

n°1272453
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 12:53:24  profilanswer
 

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.

n°1272484
theshockwa​ve
I work at a firm named Koslow
Posté le 23-12-2005 à 13:38:01  profilanswer
 

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
n°1272491
theshockwa​ve
I work at a firm named Koslow
Posté le 23-12-2005 à 13:53:09  profilanswer
 

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)

n°1272493
liba
Posté le 23-12-2005 à 13:56:08  profilanswer
 

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

n°1272495
theshockwa​ve
I work at a firm named Koslow
Posté le 23-12-2005 à 13:59:08  profilanswer
 

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


Message édité par theshockwave le 23-12-2005 à 14:00:26
n°1272498
liba
Posté le 23-12-2005 à 14:03:11  profilanswer
 

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

n°1272499
theshockwa​ve
I work at a firm named Koslow
Posté le 23-12-2005 à 14:04:27  profilanswer
 

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
n°1272503
liba
Posté le 23-12-2005 à 14:15:08  profilanswer
 

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

n°1272632
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 16:34:31  profilanswer
 

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'


mood
Publicité
Posté le 23-12-2005 à 16:34:31  profilanswer
 

n°1272638
Taz
bisounours-codeur
Posté le 23-12-2005 à 16:39:00  profilanswer
 

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

n°1272639
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 16:39:35  profilanswer
 

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

n°1272640
Taz
bisounours-codeur
Posté le 23-12-2005 à 16:40:37  profilanswer
 

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

n°1272641
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 16:41:44  profilanswer
 

j'avais a demi tord [:cupra] ?

n°1272649
Taz
bisounours-codeur
Posté le 23-12-2005 à 16:53:30  profilanswer
 

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.

n°1273570
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 10:18:35  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  vecteur de string static

 

Sujets relatifs
Decouper une chaine String[XSchema] restrictions sur type string
QT en Static Linking[c] String
vecteur de poiteur sur fonction[Pascal] Chaine de caractere (string)
" dans un stringopération sur string
Methode static dans une classerreur de segmentation sur string
Plus de sujets relatifs à : vecteur de string static


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR