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

  FORUM HardWare.fr
  Programmation
  C++

  (DEBUTANT) Probleme de classe en c++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

(DEBUTANT) Probleme de classe en c++

n°1943191
berserendo
Posté le 22-11-2009 à 13:08:25  profilanswer
 

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`

mood
Publicité
Posté le 22-11-2009 à 13:08:25  profilanswer
 

n°1943192
Joel F
Real men use unique_ptr
Posté le 22-11-2009 à 13:32:22  profilanswer
 

poste ton code de Liste en entier stp

n°1943196
berserendo
Posté le 22-11-2009 à 13:40:51  profilanswer
 

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,

n°1943197
berserendo
Posté le 22-11-2009 à 13:53:36  profilanswer
 

L'erreur porte bien sur la méthode get

n°1943207
Joel F
Real men use unique_ptr
Posté le 22-11-2009 à 15:09:51  profilanswer
 

* 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
n°1943210
berserendo
Posté le 22-11-2009 à 15:20:22  profilanswer
 

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
n°1943212
Joel F
Real men use unique_ptr
Posté le 22-11-2009 à 15:39:08  profilanswer
 

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

n°1943217
berserendo
Posté le 22-11-2009 à 15:48:45  profilanswer
 

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

n°1943219
Joel F
Real men use unique_ptr
Posté le 22-11-2009 à 16:07:36  profilanswer
 

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

n°1943223
berserendo
Posté le 22-11-2009 à 16:16:49  profilanswer
 

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.

mood
Publicité
Posté le 22-11-2009 à 16:16:49  profilanswer
 

n°1943226
Joel F
Real men use unique_ptr
Posté le 22-11-2009 à 16:29:58  profilanswer
 

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 ;)

n°1943227
berserendo
Posté le 22-11-2009 à 16:38:06  profilanswer
 

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`

n°1943230
Joel F
Real men use unique_ptr
Posté le 22-11-2009 à 16:51:14  profilanswer
 

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.


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

  (DEBUTANT) Probleme de classe en c++

 

Sujets relatifs
Problème configuration phpMyAdminURGENT : problème shell windows boucle for
Problème balises fichier swfProblème avec la fonction Unlink
[C++] classe array 1d et delete[]Problème Jointure SQL
Problème de superpositionProblème insertion dans une base d'un champ texte
[C++] Map statique dans une classe[Débutant] Problème de classe
Plus de sujets relatifs à : (DEBUTANT) Probleme de classe en c++


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