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

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

Marsh Posté le 27-12-2010 à 02:49:12    

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

Marsh Posté le 27-12-2010 à 02:49:12   

Reply

Marsh Posté le 27-12-2010 à 07:40:33    

new, delete etc ...


Message édité par Joel F le 27-12-2010 à 07:41:47
Reply

Marsh Posté le 27-12-2010 à 13:14:54    

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
Reply

Marsh Posté le 27-12-2010 à 14:16:52    

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

Reply

Marsh Posté le 28-12-2010 à 05:07:58    

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:  
 
 
 

Reply

Marsh Posté le 28-12-2010 à 10:32:37    

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

Reply

Marsh Posté le 28-12-2010 à 14:19:31    


 [: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 !

Reply

Marsh Posté le 28-12-2010 à 20:26:48    

dindon_sauvage a écrit :


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


 
ca ne m'etonnes guère ...

Reply

Sujets relatifs:

Leave a Replay

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