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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] tableau de classe dans une autre classe ?

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] tableau de classe dans une autre classe ?

n°2044464
dindon_sau​vage
Posté le 27-12-2010 à 02:49:12  profilanswer
 

:hello:  
 
j'ai un petit problème dans un de mes exos, il faut faire un tableau d'une classe dans une classe diffèrente, et je n'arrive pas du tout a définir ce tableau.  
j'ai d'abord crée la classe ligne avec un constructeur pour allouer un tableau de la taille voulue, ensuite le but de l'exo est de definir une classe matrice, en y allouant un tableau de classe lignes ... et je n'y arrive malheureusement pas  :pfff:  
 
voici la définition de mes classes:
 

Code :
  1. class ligne
  2. {
  3. private:
  4. int nb_valeurs;
  5. int *valeurs;
  6. public:
  7. ligne(int = 10);
  8. ~ligne();
  9. void modif(int n, int var );
  10. int acces (int );
  11. friend ostream&
  12.  operator<<( ostream&, ligne& );
  13. };
  14. class matrice
  15. {
  16. private:
  17. int nb_lignes;
  18. int nb_colonnes;
  19. ligne *mat;
  20. public:
  21. matrice ( int = 10, int = 10);
  22. //~matrice();
  23. void modif(int n, int m, int var);
  24. int acces( int n, int m);
  25. };


 
 
j'en suis a la création du constructeur de 'matrice'
 

Code :
  1. matrice::matrice( int n, int m) : mat (m)
  2. {
  3. nb_lignes=n;
  4. nb_colonnes=m;
  5. }


 
mais voila, je ne vois pas comment faire pour un tableau de classe ... quand c'est pour utiliser une classe dans une autre classe, je vois comment cela fonctionne et je sais le faire, mais la, j'ai vraiment besoin de vos lanternes  :jap:  
 
merci d'avance


Message édité par dindon_sauvage le 27-12-2010 à 02:49:58
mood
Publicité
Posté le 27-12-2010 à 02:49:12  profilanswer
 

n°2044468
Joel F
Real men use unique_ptr
Posté le 27-12-2010 à 07:40:33  profilanswer
 

new, delete etc ...


Message édité par Joel F le 27-12-2010 à 07:41:47
n°2044529
dindon_sau​vage
Posté le 27-12-2010 à 13:14:54  profilanswer
 

bon j'ai essayé ça :
 

Code :
  1. matrice::matrice( int n, int m)
  2. {
  3. nb_lignes=n;
  4. nb_colonnes=m;
  5. mat= new ligne[n];
  6. for (int i=0; i<n;i++)
  7. {
  8. ligne temp(m);
  9. mat[i]=temp;
  10. }
  11. }


 
et comme on pouvait s'en douter, c'est la meme ligne pour toute la matrice, des que je modifie une valeur sur une ligne, la modification est effective pour toutes les autres.
 
on ne peut pas utiliser directement le constructeur de la classe ligne ici ? il faut pour ainsi dire le refaire dans le constructeur de la classe matrice ?  
 
merci  :jap:

Message cité 1 fois
Message édité par dindon_sauvage le 27-12-2010 à 13:15:30
n°2044544
Joel F
Real men use unique_ptr
Posté le 27-12-2010 à 14:16:52  profilanswer
 

dindon_sauvage a écrit :

bon j'ai essayé ça :
 

Code :
  1. matrice::matrice( int n, int m)
  2. {
  3. nb_lignes=n;
  4. nb_colonnes=m;
  5. mat= new ligne[n];
  6. for (int i=0; i<n;i++)
  7. {
  8. ligne temp(m);
  9. mat[i]=temp;
  10. }
  11. }




 
Dote ta class ligne d'une methode resize qui redimensionne ta ligne et appelle cette methdoe dans ta boucle.
Ou utilise std::vector ...
 
Sinon, la maniere efficace d'allouer une matrix : http://codepad.org/nDy8z2iG

n°2044728
dindon_sau​vage
Posté le 28-12-2010 à 05:07:58  profilanswer
 

je pensais avoir trouvé mon bonheur avec le std::vector (d'ailleurs merci de m'avoir fait découvrir ça, ca a vraiment l'air d'etre utile)  
mais cela ne fonctionne pas vraiment avec ma classe ligne, et je ne comprend pas pourquoi ....
 
 
j'ai trouvé qqs tuto et j'ai fait des tests avec des tableaux simples, j'arrive a modifier les élements sans problèmes, mais il y a un couac avec ma class:
 

Code :
  1. matrice::matrice( int n, int m)
  2. {
  3. nb_lignes=n;
  4. nb_colonnes=m;
  5. vector<ligne> mat(n,m);
  6. mat[2].modif(5,5);
  7. for (int i=0; i<n;i++)
  8.  cout << "test " << mat[i] <<endl;
  9. }


 
 
ici par exemple, j'obtiens bien une matrice avec le nb de colonnes et de lignes voulu, mais dès que je veux modifier un élément, par exemple ici le 5ieme élément  
de la 3ieme ligne, ce me modifie tous les éléments de la 5ème colonne, j'ai donc ceci pour une 5*10 :
 
test 0 0 0 0 5 0 0 0 0 0  
test 0 0 0 0 5 0 0 0 0 0  
test 0 0 0 0 5 0 0 0 0 0  
test 0 0 0 0 5 0 0 0 0 0  
test 0 0 0 0 5 0 0 0 0 0  
 
alors que je devrais avoir puisque j'ai fait 'mat[2].modif(5,5)';
 
test 0 0 0 0 0 0 0 0 0 0  
test 0 0 0 0 0 0 0 0 0 0  
test 0 0 0 0 5 0 0 0 0 0  
test 0 0 0 0 0 0 0 0 0 0  
test 0 0 0 0 0 0 0 0 0 0  
 
et 2ième chose, j'ai un beau message d'erreur à la fin du bloc d'instruction, du genre :
*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x00000000017ed0a0 ***
 
c'est du à quoi ? peut etre parce que je n'ai pas encore fait de destructeur ?  
 
et dernière petite chose (desolé ca commence a faire beaucoup  :ange: )
j'ai déclaré un tableau dans la classe matrice, mais j'utilise vector dans le constructeur, comment faire en sorte de déclarer un vector dans la définition de la classe ? a moins que ce que j'ai fait ne pose pas de problèmes, c'est à dire déclarer le vector avec le nom du tableau définit dans la classe (ici 'mat')
 
 
merci en tout cas pour vos réponses  :jap:  
 
 
 

n°2044749
Joel F
Real men use unique_ptr
Posté le 28-12-2010 à 10:32:37  profilanswer
 

un truc genre
 

Code :
  1. class ligne
  2. {
  3.   private:
  4.   std::vector<int> valeurs;
  5.   public:
  6.   ligne() {}
  7.   ligne(int sz) : valeurs(sz)
  8.   {
  9.     // cette notation est une liste d'initialisation.
  10.     // Elle construit valeurs a la bonne taille directement
  11.   }
  12.   ~ligne()
  13.   {
  14.     // rien a faire ici, le dtor de vector fait ce qu'il faut
  15.   }
  16.   void resize(int s) { valeurs.resize(s); }
  17.   void modif(int n, int var )
  18.   {
  19.     valeurs[n] = var;
  20.   }
  21.   // acces ne modifie pas l'instance de ligne, elle est declare const
  22.   int acces(int n) const
  23.   {
  24.     return valeurs[n];
  25.   }
  26. };
  27. class matrice
  28. {
  29.   private:
  30.  
  31.   std::vector<ligne> mat;
  32.   public:
  33.   matrice() {}
  34.   matrice( int c, int l) : mat(l)
  35.   {
  36.     // retaille ttes les lignes a c colonnes
  37.     for(int i=0;i<l;++i)
  38.      mat[i].resize(c);
  39.   }
  40.   ~matrice() { /* rien a faire */ }
  41.   void modif(int c, int l, int var)
  42.   {
  43.     mat[l].modif(c,var);
  44.   }
  45.   int acces( int c, int l) const
  46.   {
  47.     return mat[l].acces(c);
  48.   }
  49. };


 
fonctionne proprement.
Je te conseille de regarder la surcharge de l'operateur[] pour pouvori ecrire matrice[i][j] au lieu d'avoir modif/acces

n°2044811
dindon_sau​vage
Posté le 28-12-2010 à 14:19:31  profilanswer
 


 [:implosion du tibia]  
 
je n'avais pas pensé a revoir complétement le programme, mais maintenant je vais me forcer a utiliser des vector, c'est simple d'utilisation et tres pratique ... mon prof n'en avait malheureusement pas parlé du tout.  
 
 
merci beaucoup en tout cas !

n°2044873
Joel F
Real men use unique_ptr
Posté le 28-12-2010 à 20:26:48  profilanswer
 

dindon_sauvage a écrit :


... mon prof n'en avait malheureusement pas parlé du tout.  


 
ca ne m'etonnes guère ...


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

  [C++] tableau de classe dans une autre classe ?

 

Sujets relatifs
[resolu]tableau d'objet dans une classe (et ca marche pas bien sur)Renvoie de tableau en appelant une classe
probleme d'assignation de valeur avec un tableau dans une classeinitaliser un tableau de classe avec new ?
[C++] Erreur déclaration tableau dans classeInsérer une classe CSS dans un tableau PHP
Classe abstraite et tableau d'objetsrecupere ou mettre a jour un tableau de double dans une classe
[java] Classe abstraite, polymorphisme et tableauFaire un tableau de variables d'une classe?
Plus de sujets relatifs à : [C++] tableau de classe dans une autre classe ?


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