[c++] class (newbie) [résolu]

class (newbie) [résolu] [c++] - C++ - Programmation

Marsh Posté le 02-07-2002 à 09:34:00    

Pourquoi cela ne fonctionne t il pas?
 
code:

Code :
  1. typedef char string[255];
  2. class decomp
  3. {
  4. private:
  5. const int nblg =10, nbcar = 255;
  6. char *ch = new char[nbcar*nblg];
  7. char tab[nbcar][nblg];
  8. public:
  9. decomp(string nom_fichier);
  10. void afficher();
  11. };


 
voici ma liste d erreur:
 error C2258: illegal pure syntax, must be '= 0'      //il parle de nblg
 error C2252: 'nblg' : pure specifier can only be specified for functions //il parle de nblg
 error C2258: illegal pure syntax, must be '= 0'    //il parle de nbcar
 error C2252: 'nbcar' : pure specifier can only be specified for functions //il parle de nbcar
 error C2258: illegal pure syntax, must be '= 0'    //il parle de ch
 error C2252: 'ch' : pure specifier can only be specified for functions  //il parle de ch
 error C2065: 'nbcar' : undeclared identifier
 ...
 
Ne peux t on pas déclarer de variable dans la partie private de ma class ou ca vien d autre part???
Si je met mon   const int nblg =10, nbcar = 255;  juste apres mon typedef il ne me fait pas les 4 premieres erreurs mais bon il me fait qd meme celles avec ch et mon tab !  
Comment puis je faire ???
 
D avance merci


Message édité par the big ben le 04-07-2002 à 10:36:11
Reply

Marsh Posté le 02-07-2002 à 09:34:00   

Reply

Marsh Posté le 02-07-2002 à 09:35:40    

Toi tu bosse avec Visual non?
 
Oublie les membre constant c mal géré.


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 09:40:41    

Si non la bonne sintaxe serait (en plus y a une erreur conceptuelle):
 
Dans le Header:

Code :
  1. class Decomp
  2. {
  3.    private:
  4.            static const int  nblg;
  5.            static const int  nbcar;
  6.            char              *ch;
  7.            char              *tab;
  8.    public:
  9.                 Decomp(string nom_fichier);
  10.                ~Decomp()
  11.            void afficher();
  12. };


 
Dans le cpp:

Code :
  1. const int  Decomp::nblg  = 10;
  2. const int  Decomp::nbcar = 255;
  3. Decomp::Decomp(string nom_fichier)
  4. {
  5.    ch = new char[nbchar*nblg];
  6.    tab = new char[nbchar*nblg];
  7.   //Ton code
  8. }
  9. Decomp::~Decomp()
  10. {
  11.    delete[] ch;
  12.    delete[] tabb;
  13. }


Message édité par LetoII le 02-07-2002 à 09:42:49

---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 09:41:17    

oui je travail en visual ...
Snif il n y a vraiment pas moyen ???  :(

Reply

Marsh Posté le 02-07-2002 à 09:42:38    

que signifie exactement le static ???

Reply

Marsh Posté le 02-07-2002 à 09:43:38    

Ca défini un membre de classe. C'est à dire commun à toutes les instances de la classe.


Message édité par LetoII le 02-07-2002 à 09:43:50

---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 09:45:29    

Bon ok je vais essayer ca merci beaucoup ...

Reply

Marsh Posté le 02-07-2002 à 09:47:24    

Essaye ce que je t'ai envoyé, c la syntaxe normale, mais je pense pas que ça marche sous visual.


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 11:00:59    

Ca fonctionne sauf mon tableau car c est en fait un tableau a 2 dimension et non pas un pointeur vers un tableau que je veux de + c est un tab a 2 dimension comment dois je faire ??
 
mon code actuel:
 

Code :
  1. class decomp
  2. {
  3. private:
  4. static const int  nblg;
  5.     static const int  nbcar;
  6. char *ch ;
  7. char tab[nbcar][nblg];  //*** CE TABLEAU CI !! ****
  8. public:
  9. decomp(string nom_fichier);
  10. ~decomp();
  11. void afficher();
  12. };
  13. const int  decomp::nblg  = 10;
  14. const int  decomp::nbcar = 255;
  15. decomp::decomp(string nom_fichier)
  16. {
  17. ch = new char[nbcar*nblg];
  18. ...
  19. }


 
Est ce que juste faire
 char *tab; puis
 tab = new [nbcar][nblg]; suffit?
Est ce que ca fait la meme chose que ce que je veux faire?

Reply

Marsh Posté le 02-07-2002 à 11:10:11    

Là faut que tu test, j'ai jamais essayé. Par contre je crois que y a une syntaxe à la con pour déclarer la variable.
 
Mon conseil: tu fais un tableau comme je te l'ai mis dans le code et pour accéder à un élémenttu fais:
 

Code :
  1. //avant: tab[i][j]
  2. tab[i*nbcar+j];


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 11:10:11   

Reply

Marsh Posté le 02-07-2002 à 11:43:31    

mouais bon c est une solution (si ca fct qd mem) mais c est loin d etre joli ...


Message édité par the big ben le 02-07-2002 à 11:43:50
Reply

Marsh Posté le 02-07-2002 à 11:45:25    

tu peux toujour tanter différentes permutations de:
 

Code :
  1. char (*tab)[taille1][taille2];


 
il me semble que c une syntaxe dans ce genre, mais bon...


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 11:46:32    

ok je vais essayer de chipotter un peu avec ca...  
Merci !

Reply

Marsh Posté le 02-07-2002 à 12:56:49    

letoII a écrit a écrit :

Là faut que tu test, j'ai jamais essayé. Par contre je crois que y a une syntaxe à la con pour déclarer la variable.
 
Mon conseil: tu fais un tableau comme je te l'ai mis dans le code et pour accéder à un élémenttu fais:
 

Code :
  1. //avant: tab[i][j]
  2. tab[i*nbcar+j];






 
Rien de tel pour rendre du code totalement illisible  et indébuggable :sarcastic:  
 
la méthode correcte est de reserver un tableau de pointeur et de reverser une chaine pour chaque pointeur :
 

Code :
  1. char** tableauDeChaine = NULL;
  2. tableauDeChaine = new char*[nbDeChaine]; // reserve un tableau de 'nbDeChaine' pointeurs
  3. tableauDeChaine[0] = new char[tailleDeChaine]; // reserve une chaine à la position 0 => avec un for, tu réserves tout le tableau

Reply

Marsh Posté le 02-07-2002 à 14:10:55    

Smaragdus a écrit a écrit :

 
 
Rien de tel pour rendre du code totalement illisible  et indébuggable :sarcastic:  
 
la méthode correcte est de reserver un tableau de pointeur et de reverser une chaine pour chaque pointeur :
 

Code :
  1. char** tableauDeChaine = NULL;
  2. tableauDeChaine = new char*[nbDeChaine]; // reserve un tableau de 'nbDeChaine' pointeurs
  3. tableauDeChaine[0] = new char[tailleDeChaine]; // reserve une chaine à la position 0 => avec un for, tu réserves tout le tableau






 
S'il veut mêtre des chaines dedans ok, si non, bof.


Message édité par LetoII le 02-07-2002 à 14:11:09

---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 20:42:27    

ça manque de constructeur de recopie tout ce bordel :D

Reply

Marsh Posté le 02-07-2002 à 20:44:49    

bjone a écrit a écrit :

ça manque de constructeur de recopie tout ce bordel :D




 
Faut bien qu'il bosse un peu, je vais pas tout lui faire non plus! :D


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2002 à 22:00:40    

Une solution: utilise des enum pour definir les tailles. Je sais c'est pas top, mais bon c'est de la faute a MS qui n'aime pas les standards...

Reply

Marsh Posté le 03-07-2002 à 04:09:06    

Ça viendra, mais on ne peut pas initialiser les constantes statiques de classe dans la déclaration de classe.
 
Alors utilises le truc de l'enum:

Code :
  1. class decomp {
  2. public:
  3. enum { nblg  = 10,nbcar = 255};
  4. char tab[nbcar][nblg];
  5. static char tab2[nbcar][nblg];
  6. };
  7. char tab2[decomp::nbcar][decomp::nblg]={1,2,3};


 
Pour initialiser tab, ben c'est le constructeur qui s'y colle.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 03-07-2002 à 07:24:52    

musaran a écrit a écrit :

Ça viendra, mais on ne peut pas initialiser les constantes statiques de classe dans la déclaration de classe.
 
Alors utilises le truc de l'enum:

Code :
  1. class decomp {
  2. public:
  3. enum { nblg  = 10,nbcar = 255};
  4. char tab[nbcar][nblg];
  5. static char tab2[nbcar][nblg];
  6. };
  7. char tab2[decomp::nbcar][decomp::nblg]={1,2,3};


 
Pour initialiser tab, ben c'est le constructeur qui s'y colle.




 
Ben non justement, à part avec visual ou c mal fichu, tu fait ça dans le cpp.


---------------
Le Tyran
Reply

Marsh Posté le 04-07-2002 à 00:16:09    

letoII a écrit a écrit :

Ben non justement, à part avec visual ou c mal fichu, tu fait ça dans le cpp.


tu peux préciser ?
 
Si l'initialisation des constantes statiques peut se faire sur place, c'est que la norme à évolué ou que c'est pas standard ?
 
Je ne l'ai pas dit, mais la définition de tab2 doît être dans le source cpp.
 
Quand à tab, ce que je sais de la norme me dit qu'en tant que membre de donnée non statique, c'est dans le constructeur qu'on peut le remplir.


Message édité par Musaran le 04-07-2002 à 00:20:04

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 04-07-2002 à 08:11:13    

Regarde un peu plus haut ce que j'ai posté


---------------
Le Tyran
Reply

Marsh Posté le 04-07-2002 à 10:35:51    

Merci a tous !  :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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