Salut, et bienvenue sur le forum.
Quelques remarques préliminaires:
- Il est peu recommandé de faire deux choses à la fois, surtout s'il s'agit d'allouer de la mémoire pour un membre et d'en initialiser un autre
- Il est des plus intéressant d'utiliser les listes d'initialisation dans le constructeur
- Si tu crées une boucle pour allouer dynamiquement de la mémoire, il te faut une boucle pour libérer correctement toute la mémoire
- Sais tu qu'il n'y a rien de plus proche d'un tableau à deux dimensions qu'un tableau à une seule
si tu reste dans des dimensions raisonables (je dirais > à 1000*1000), cela peut te faciliter la vie 
Dans l'ordre, cela signifie que, dans le constructeur, la ligne
tabValeurs = new int * [dimension = dim];
est une véritable horreur pour les yeux (après trois jours sans avoir touché à ce code, je te mets au défis de te rappeler tout de suite que tu initialise dimention au passage
)
et serait avantageusement remplacée, au pire, par
1 2
| dimention=dim;
tabValeurs = new int *[dimention]; |
Mais, la deuxième remarque aidant, on préférera carrément un code ressemblant à
1 2 3 4 5
| Grille::Grille (int dim):dimention(dim)
{
tabValeurs = new int *[dimention];
/*...*/
} |
La remarque en [3] est motivée par le destructeur:
Lorsque, après avoir fait un
1 2 3 4 5
| tabValeurs = new int *[dimention];
for (int i = 0; i < dimension ; i++)
{
tabValeurs[i] = new int [dimension];
} |
tu te contente d'un
cela ne provoque absolument pas la libération de la mémoire qui avait été allouée pour tabValeurs[0] à tabValeurs[dimention]...
Ce phénomène s'appelle les "fuites mémoire" (memory leaks en anglais), et fait que, plus tu créera et détruira des objets du type concerné (ici grille), plus tu te retrouvera avec une quantité importante de mémoire que le système considère comme utilisée par l'application, mais à laquelle on n'a plus aucun moyen d'accéder 
A la longue, cela peut entraîner un tas de problèmes, allant du simple ralentissement au plantage pur et simple de l'application (si pas du système complet), et il vaut donc mieux éviter d'en arriver là 
Pour éviter le problème, le destructeur devrait ressembler à
1 2 3 4 5 6
| Grille ::~Grille()
{
for(int i=0;i<dimention;i++)
delete[] tabValeurs[i];
delete[] tabValeurs;
} |
Et cela nous emmène tout droit à la remarque [4]...
Etant donné qu'il est très facile d'oublier de libérer la deuxième dimension avant de libérer la première, et que, de toutes manière, la mémoire ne se présente quand même que sous la forme d'un tableau à une dimension, on peut se baser sur le fait qu'une grille de X lignes et de Y colonnes n'est jamais qu'une "représentation visuelle" de X*Y cellules 
L'avantage étant que l'on peut alors demander l'allocation dynamique de toute la mémoire ne une seule fois sous la forme générique de
type* tab = new type[X*Y];
et bien évidemment la libération de la mémoire en une seule fois aussi sous la forme de
L'inconvénient principal réside dans le fait... qu'on court beaucoup plus de risques - si le nombre de lignes et de colonnes est important - que le système ne trouve plus autant de mémoire contiguë disponible...
Mais bon, si cela peut t'inciter à gérer la mémoire en "bon père de famille", c'est un moindre mal 
Il reste le détail de la manière d'accéder aux différentes cellules à aborder avec cette optique, et, pour ne pas me lancer (encore une fois
) dans un roman, je me contenterai de te fournir la formule sous forme d'une petite fonction (explications sur demande
)
1 2 3 4 5
|
type Grille::GetCellule(int ligne, int colonne)
{
return tab[ligne*nbcolonne + colonne]
} |
où nbcolonne est le nombre total de colonnes présentes dans la grille
Partager