(DEBUTANT) Probleme de classe en c++

Probleme de classe en c++ (DEBUTANT) - C++ - Programmation

Marsh Posté le 22-11-2009 à 13:08:25    

Bonjour,
J'ai un petit probleme de classe.

Introduction :

En fait ,j'ai crée une classe liste qui me permet de gerer des tableaux contenant des structures ( ici corps )
J'ai due donc redéfinir l'operateur []

Code :
  1. corps Liste::operator[](int n)
  2. {
  3. return liste[n];
  4. }


 
Mais si je veux appellée une composante de la structure ce n'est pas possible :  
 listecorps[j]->position.x // il me dit : base operand of ‘->’ has non-pointer type ‘Liste’
listecorps[j].position.x // il me dit : ‘class Liste’ has no member named ‘position’
 
Je me suis dis que vu que je parle ici de pointeur, il faudrai surcharger l'operateur [], ce que j'ai essayé de faire, mais cela ne fonctionne pas :
corps* Liste::operator[](int)’ cannot be overloaded
 
Concretement :
Ainsi, j'ai décidé de créer une fonction get :
 
J'ai ecris dans la classe la méthode :

Code :
  1. corps* get(int p);


et dans le liste.cpp :
 

Code :
  1. corps * Liste::get(int p)
  2. {
  3.     return *liste[p];
  4. }


Il m'indique encore une erreur dans le liste .cpp  :
error: no match for ‘operator*’ in ‘**(((Liste*)this)->Liste::liste + ((unsigned int)(((unsigned int)p) * 28u)))’
 
Je ne comprend pas l'erreur,
J'attend vos réponses avec impatiente.
Merci d'avance,
berse`

Reply

Marsh Posté le 22-11-2009 à 13:08:25   

Reply

Marsh Posté le 22-11-2009 à 13:32:22    

poste ton code de Liste en entier stp

Reply

Marsh Posté le 22-11-2009 à 13:40:51    

D'accord,  
Dans le main il n'y a rien, si ce n'est une fonction d'affichage. Le probleme se situe uniquement entre la liste et les corps.
Voici les fichiers :
 
Liste.cpp :


#include "liste.h"
 
#define DEFSIZE 10
 
Liste::Liste()
{
 liste = new corps[DEFSIZE];
 tailleMax = DEFSIZE;
 nbElement = 0;
}
 
Liste::Liste(int l, corps c)
{
 liste = new corps[l];
 tailleMax = (l>1)?l:1;
 nbElement = 0;
 
 for(int i=0;i<l;i++) {
  addcorps(c);
 }
}
 
void Liste::verifierTaille(){
 if(nbElement==tailleMax){ // tableau plein
  int nt=tailleMax*2; // nouvelle taille, 2 fois plus grand que le prÈcÈdent croissance geometrique
  corps * tmp = new corps[nt];   // allocation de  la memoire
  for(int i=0;i<nbElement;i++) //recopie de l'ancien tableau dans le nouveau
   tmp[i]=liste[i];
  delete [] liste; // liberation de la memoire de l'ancien tableau
  liste=tmp; // affectation du nouveau tableau
  tailleMax=nt; // on sauvegarde sa taille
 }
}
 
void Liste::addcorps(corps c)
{
 verifierTaille();
 liste[nbElement++] = c;
}
 
void Liste::rmcorps()
{
 if(nbElement >= 0)
  nbElement--;
 else {
  cerr << "Liste vide !" << endl;
 }
}
 
void Liste::delcorps(int n)
{
 if(n < tailleMax && n >= 0) {
  for(int i = n+1; i < tailleMax ;i++) {
   liste[i-1] = liste[i];
  }
  nbElement--;
 } else {
  cerr << "n invalide !" << endl;
 }
}
 
void Liste::inscorps(corps c, int n)
{
 if(nbElement+1<tailleMax) {
  for(int i=nbElement+1;i>n;i--) {
   liste[i+1] = liste[i];
  }
  liste[n] = c;
  nbElement++;
 } else {
  cerr << "Impossible d'inserer n" << endl;
 }
}
 
int Liste::longueur()
{
 return nbElement;
}
 
 
corps Liste::operator[](int n)
{
 return liste[n];
}
 
corps * Liste::get(int p)
{
    return *liste[p];
}


 
 
 
Liste.h

Code :
  1. #include "corps.h"
  2. //Definition de corps
  3. class Liste {
  4.     // tableau de corps
  5. corps *liste;
  6. // taille du tableau
  7. int tailleMax;
  8. // nombre d'ÈlÈemnt dans le tableau
  9. int nbElement;
  10.     // gestion dynamique de la taille de la liste, agrandit le tableau si il est plein
  11.     void verifierTaille();
  12. public:
  13.     // construit une liste vide
  14. Liste();
  15. // construit une liste contenant l fois le corps c
  16. Liste(int l, corps c);
  17. // ajoute le corps c a la fin de la liste
  18. void addcorps(corps c);
  19. // supprime le dernier corps de la liste
  20. void rmcorps();
  21. // supprime le n-iËme corps
  22. void delcorps(int n);
  23. // insere le corps en position n
  24. void inscorps(corps c, int n);
  25. // nombre de corps dans la liste
  26. int longueur();
  27. //accede au n-ieme element
  28. corps operator[](int n);
  29. corps* get(int p)
  30. };


 
 
Corps.cpp

Code :
  1. corps new_corps()
  2. {
  3.     corps c;
  4.     c.masse=0;
  5.     c.acceleration.x=0;
  6.     c.acceleration.y=0;
  7.     c.vitesse.x=0;
  8.     c.position.x=0;
  9.     c.vitesse.y=0;
  10.     c.position.y=0;
  11.     return c;
  12. }
  13. corps new_corps(float m, Coord posi, Coord viti, Coord acci)
  14. {
  15.     corps c;
  16.     c.masse=m;
  17.     c.position=posi;
  18.     c.vitesse=viti;
  19.     c.acceleration=acci;
  20.     return c;
  21. }


 
 
 
Corps.h

Code :
  1. struct corps
  2. {
  3.     float masse;
  4. Coord position;
  5. Coord vitesse;
  6. Coord acceleration;
  7. };
  8. corps new_corps();
  9. corps new_corps(float m, Coord posi, Coord viti, Coord acci);


Coord est juste une structure contenant deux float x et y :).
 
Merci d'avance,

Reply

Marsh Posté le 22-11-2009 à 13:53:36    

L'erreur porte bien sur la méthode get

Reply

Marsh Posté le 22-11-2009 à 15:09:51    

* une liste c'est pas un pointeur, utilise std::vector ou std::list
* c'est quoi c'est fonction new_corps ? Tu n'as pas entendu aprlé de la notion de constructeur ? Mieux, si c'est des structures sans plus, tu peut utiliser l'initialisation par aggregation.
* Conceptuellement acceder au nieme element d'une liste c'ets bancal. Une liste ca a une tete et une queue, point.

 

Voila une version qui marche avec heritage privé sur vector:
http://codepad.org/6GRzUXZl

 

Une version avec composition simple:
http://codepad.org/AwgXZz36

 

la doc de std::vector :
http://www.cplusplus.com/reference/stl/vector/

 

Le pourquoi de l'heritage privé :
http://www.parashift.com/c++-faq-l [...] tance.html

 

Revois aussi ta notion de reference et de const :
http://www.parashift.com/c++-faq-lite/references.html
http://www.parashift.com/c++-faq-l [...] tness.html


Message édité par Joel F le 22-11-2009 à 15:13:33
Reply

Marsh Posté le 22-11-2009 à 15:20:22    

J'ai un projet a faire avec contraintes de créer une classe liste. Je ne peut pas utiliser les armes lourdes que tu me cites :(...
En tout cas, je garde le code que tu m'as fais ainsi que les adresses pour aller plus loin une fois que j'aurai rendu ce fichu projet ! merci.

 

Par contre, j'ai du mal à comprendre ta remarque :  une liste c'est pas un pointeur. Ou est ce que tu as vu dans le code que je pensais ca ? Je parlais plutot de tableau de pointeurs, non ?
Pour l'instant, mon objectif premier est d'arranger cette fonction :corps* get(int p)
qui me donne donc cette erreur au niveau de la descritption de la methode :
error: no match for ‘operator*’ in ‘**(((Liste*)this)->Liste::liste + ((unsigned int)(((unsigned int)p) * 28u)))’

 

Merci d'avance,
berse`

Message cité 1 fois
Message édité par berserendo le 22-11-2009 à 15:24:45
Reply

Marsh Posté le 22-11-2009 à 15:39:08    

berserendo a écrit :

J'ai un projet a faire avec contraintes de créer une classe liste. Je ne peut pas utiliser les armes lourdes que tu me cites :(


 
Encore une formation de qualité tiens  :sarcastic:  
 
Ton [] doit etre dedoubler : un const et un non const qui renvoit une reference.
Ensuite, montre comment tu appelles ton [] dans ton main

Reply

Marsh Posté le 22-11-2009 à 15:48:45    

Ton [] doit etre dedoubler : un const et un non const qui renvoit une reference.  
Je ne sais pas exactement comment me servir de const, cela dit, j'ai compris que tu voulais que je fasse ca :  
 
 
Dans le liste.h :

Code :
  1. corps operator[](int n) const;
  2.     corps & operator[](int n);


 
Dans le liste.cpp
 

Code :
  1. corps Liste::operator[](int n) const
  2. {
  3. return liste[n];
  4. }
  5. corps & Liste::operator[](int n)
  6. {
  7. return &liste[n];
  8. }


 
 
C'est bien ca ?
Au sinon voila l'appel que je compte faire :
dessineCercle(listecorps[j]->position.x,listecorps[j]->position.y)  
avec dessineCercle programmé par le professeur où les 2 arguments sont des coordonnés en float.
 
Merci

Reply

Marsh Posté le 22-11-2009 à 16:07:36    

Presque:
 

Code :
  1. corps Liste::operator[](int n) const
  2. {
  3. return liste[n];
  4. }
  5. corps & Liste::operator[](int n)
  6. {
  7. return liste[n];
  8. }


 
Une reference n'est pas un pointeur.
 
Ensuite tu utilise . pas ->

Reply

Marsh Posté le 22-11-2009 à 16:16:49    

D'accord. J'ai implémenter les méthodes comme tu m'as indiqué.
Ainsi, dans le main je fais :  
 Liste * listecorps=new Liste();
 dessineCercle(listecorps[j].position.x,listecorps[j].position.y,0.2);
il me donne l'erreur suivante : ‘class Liste’ has no member named ‘position’
 
 
Merci.

Reply

Marsh Posté le 22-11-2009 à 16:16:49   

Reply

Marsh Posté le 22-11-2009 à 16:29:58    

oui. Tu melange tout là, le [] que tu utilise ici est le crochet de tableau qui s'applique à ton pointeur de Liste, pas celui de Liste.
 
On est pas en JAVA, donc pas besoin de new...
 
Liste l;
dessineCercle(l[j].position.x,l[j].position.y,0.2);  
 
mais ca ne amrchera que si tu as rempli ta liste hein ;)

Reply

Marsh Posté le 22-11-2009 à 16:38:06    

Super ca a l'air de marché !  
Par contre, ce n'estp lus un tableau de pointeur mais un tableau de corps c'est bien ca ?  
 
Y'a pas moyen de faire un tableau de pointeur ? Non parceque vu que j'ajoute des corps au fur et à mesure du programme ca risque de ne pas marché avec un tableau statique.
 
merci beaucoup,
berse`

Reply

Marsh Posté le 22-11-2009 à 16:51:14    

attention tu melanges tout.
ton tableau il est DANS ta classe liste. La manière dont tu alloue ta liste n'influence pas ça.
 
Si tu veut un tableau de pointeur de corps à l'interieur de ta classe, il faut l'allouer en tant que tel. C'ets super casse-geule et donc plus facilement faisable avec std::vector.

Reply

Sujets relatifs:

Leave a Replay

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