Gestion de tableaux - Besoin de conseil

Gestion de tableaux - Besoin de conseil - C++ - Programmation

Marsh Posté le 07-04-2005 à 11:49:29    

Bonjour,
je suis en train de me mettre au C++. Il se trouve que je dois gérer un tableau d'objets. J'ai donc créé une classe "cArrayElem" qui s'occupe de la gestion du tableau et une classe "cElem" qui s'occupe de chaque élément.
De plus, pour pouvoir gérer le nb d'élements, j'aurais pu mettre une variable "nb" dans la classe "cArrayElem" mais j'ai préféré mettre une variable statique "nb" dans la classe "cElem"
 
Donc j'ai fait un essai simple qui fonctionne très bien mais j'aimerais savoir si, conceptuellement, c'est bien pensé.
 
Voici le source

Code :
  1. #include <stdio.h>            // I/O fichiers classiques
  2. #include <stdlib.h>           // Standard librairies
  3. #define SZ  (5)           // Taille des allocations
  4. // Classe pour gérer un tableau d'éléments
  5. class cArrayElem {
  6. public:
  7. cArrayElem(int);      // Constructeur tableau
  8. ~cArrayElem(void);    // Destructeur tableau
  9. class cElem;          // Déclaration de la classe fille
  10. cElem **tabElem;      // Tableau d'éléments
  11. int i;                // Indice de boucle
  12. };
  13. // Classe pour gérer un élément
  14. class cArrayElem::cElem {
  15. public:
  16. cElem(int);           // Constructeur élément
  17. ~cElem(void);         // Destructeur élément
  18. int valeur;           // Valeur de l'élément
  19. static int nb;        // Nb réel d'éléments
  20. static int sz;        // Taille allouée
  21. };
  22. // Création des variables statiques de la classe "cElem"
  23. int cArrayElem::cElem::nb;
  24. int cArrayElem::cElem::sz;
  25. // Constructeur d'un élément
  26. cArrayElem::cElem::cElem(int x)
  27. {
  28. // Affichage de contrôle
  29. printf("Création 0x%x - x=%d, nb=%d, sz=%d\n", this, x, cElem::nb, cElem::sz);
  30. // Nouvel élément => nb d'éléments augmente
  31. nb++;
  32. // On remplit sa valeur
  33. valeur=x * x;
  34. }
  35. // Destructeur d'un élément
  36. cArrayElem::cElem::~cElem(void)
  37. {
  38. // Affichage de contrôle
  39. printf("Suppression 0x%x - nb=%d, sz=%d\n", this, cElem::nb, cElem::sz);
  40. // Destruction d'élément => nb d'éléments diminue
  41. nb--;
  42. }
  43. // Constructeur du tableau des éléments
  44. cArrayElem::cArrayElem(int nb)
  45. {
  46. // Allocation initiale
  47. tabElem=(cElem**)malloc(SZ * sizeof(cElem*));
  48. cElem::sz=SZ;
  49. cElem::nb=0;
  50. // Boucle de remplissage
  51. for (i=0; i < nb; i++)
  52. {
  53.  // Si on a atteint la taille allouée
  54.  if (cElem::nb == cElem::sz)
  55.  {
  56.   // On incrémente cette taille
  57.   cElem::sz+=SZ;
  58.   // On réalloue
  59.   tabElem=(cElem**)realloc(tabElem, cElem::sz * sizeof(cElem*));
  60.  }
  61.  // On crée l'élément
  62.  tabElem[i]=new cElem(i);
  63. }
  64. printf("\n" );
  65. }
  66. // Destructeur du tableau des éléments
  67. cArrayElem::~cArrayElem(void)
  68. {
  69. printf("\n" );
  70. // Boucle de destruction
  71. while (cElem::nb)
  72. {
  73.  // On supprime l'élément
  74.  delete tabElem[cElem::nb - 1];
  75. }
  76. // On supprime le tableau d'éléments
  77. free(tabElem);
  78. }
  79. int main(void)
  80. {
  81. // Création du tableau
  82. cArrayElem Array(12);
  83. // Affichage
  84. printf("Array nb=%d, sz=%d\n", cArrayElem::cElem::nb, cArrayElem::cElem::sz);
  85. for (Array.i=0; Array.i < cArrayElem::cElem::nb; Array.i++)
  86.  printf("Array(%d)=%d\n", Array.i, Array.tabElem[Array.i]->valeur);
  87. return(0);
  88. }


 
Merci de m'avoir lu


Message édité par Sve@r le 07-04-2005 à 11:50:10
Reply

Marsh Posté le 07-04-2005 à 11:49:29   

Reply

Marsh Posté le 07-04-2005 à 12:09:48    

Sve@r a écrit :

Donc j'ai fait un essai simple qui fonctionne très bien mais j'aimerais savoir si, conceptuellement, c'est bien pensé.


Bon, conceptuellement (ou plutôt : eu égard aux habitudes qu'on a en C++), c'est mal pensé. :p  
On préfère découpler les choses. Or là, ta classe CElem contient une information qui ne concerne que CArrayElem (la taille max). Et lorsque tu te mettras à utiliser la STL, tu verras que ça a encore plus de sens: le conteneur et le contenant ne se connaissent pas du tout. Ils sont combinés ensemble par généricité (templates).  
 
Mais avant d'aller plus avant, est-ce que tu peux nous expliquer ce que tu essayes de produire pour le moment. Parce qu'il y a beaucoup de choses qui ne sont pas catholiques en C++ (le fait que ça soit toléré ne veut pas dire que ça soit raisonnable) : le malloc, les printf, la classe interne non nécessaire, le #define, etc.

Reply

Marsh Posté le 07-04-2005 à 12:58:11    

Moi je te conseille le type vector (#include <vector> ) qui est un ciontenaur assez puiissant, il possède notamment les itérateurs qui évite de parcourir toute la liste de ton tableau. Je m'explique :
 
#include <vector>
using std::vector ;
 
int main(void)
{
 
vector<MonType> mon_vect ;
 
// si tu connais la taille à priori
mon_vect.resize(la_taille);
 
for (vector<MonType>::iterator it = mon_vect.begin() ; it < mon_vect.end() ; ++it)
{
 // it est une sortede pointeur pointant sur le ième élément du vecteur
 *it = elt_de_type_montype ;
}
 
// si tu ne connais pas la taille à priori tu as la méthode
mon_vect.push_back(un_elt) ;
 
// bref t'as plein de moyens de le faire, à noté aussi le  
// type const_iterator qui s'utilise comme le type iterator
// sauf que tu ne doit pas change la valeur ......
}

Reply

Marsh Posté le 07-04-2005 à 14:13:55    

=> Lam's
J'essaye juste de gérer tranquillement un tableau d'éléments. Donc j'avais pensé créer ma classe qui gère le tableau et la classe de l'élément. Et j'avais pensé aux membres statiques pour gérer le nb d'éléments. surtout que dans les bouquins, c'est expliqué qu'un membre statique n'est plus inclus dans une instance de classe mais gère la classe elle-même ce qui me paraissait une bonne idée.
Apparemment, le "vector" sert à ça
 
=> Seigneur Harry
Merci de ton exemple. Apparemment, ça a l'air puissant.
 
Merci pour les infos

Reply

Marsh Posté le 07-04-2005 à 14:26:12    

y a pas à dire c'est beau le C.
 
Et puis Coplien se retourne encore une fois dans sa tombe. Merde il est pas mort.

Reply

Sujets relatifs:

Leave a Replay

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