Bueno, ya vi la clase que me mandaste pero sigo sin entender qué es lo qué quieres hacer con esta clase. Veo que al llamar a la función
setMatrixTiles lo haces dándole como 1er agumento una matriz de 2x2, y 25 y 19 como los demás argumentos. Dentro de la función solicitas memoria para, al parecer, tener una matriz de
ancho x alto, que en este caso sería
25 x 19 ¿para qué? eso sólo su lo sabes. Tienes un ciclo que va de 0 hasta
alto - 1 y dentro de este otro más que va de 0 hasta
ancho - 1, y le asignas los valores de la matriz que le envías como argumento, en este caso la matriz de 2x2, pero tu recorres el ciclo desde 0 hasta 24 y desde 0 hasta 18, pero siendo la matriz sólo de 2x2, entonces estás accesando valores de la memoria que ya no son de la matriz pasada como argumento. Dependiendo del compilador y del sistema operativo en que estés trabajando esto te puede marcar o no error en tiempo de ejecución. Veamos ahora como asignas la memoria. Primero pides memoria para tener un arreglo de
alto apuntadores (estos apuntadores apuntan a un entero). Después solicitas, para cada uno de estos apuntadores, un arreglo de
ancho enteros. Cuando liberas la memoria de
MatrixTiles con el destructor, estás liberando la memoria para el arreglo de apuntadores, pero no liberas la memoria que solicitaste para cada uno de estos apuntadores. La expresión que usas
*(MatrixTiles + 2*i + j) es incorrecta, lo correcto es
*(MatrixTiles[j] + j), aquí no es necesario multiplicarlo por 2 ya que no solicitaste la memoria linealmente sino que primero solicitaste un arreglo de apuntadores y después un arrreglo de enteros para cada apuntador. Esto nos lleva de nuevo al asunto del error que te he mencionado (es la tercera vez que te lo digo). Sólo necesitas declarar a
MatrixTiles como un apuntador y no como un doble apuntador, y solicitar la memoria linealmente así
MatrixTiles = new [alto * ancho]. Ahora ya estaría bien cuando liberas la memoria con el destructor aunque ahí veo otro error, pues preguntas antes si
MatrixTiles es nulo, pero esta variable no la inicializas en ninguna parte. Lo corrector sería declarar un constructor e inicializar esta variable a NULL. Si lo que quieres es incializar a la variable
MatrixTiles con los valores de una matriz y y sus dimensiones, esta sería una forma de hacerlo
class CTiles {
public:
CTiles () { MatrixTiles = NULL; }
~CTiles();
void setMatrixTiles(int* matrix, int ancho, int alto);
private:
int* MatrixTiles;
};
void CTiles::setMatrixTiles(int* matrix, int ancho, int alto) {
MatrixTiles = new int[alto * ancho];
for(int j=0;j<alto;j++) {
for(int i=0;i<ancho;i++) {
*(MatrixTiles + ancho*j + i) = *(matrix + ancho*j + i);
}
}
}
CTiles::~CTiles() {
if(MatrixTiles != NULL ){
delete[] MatrixTiles;
}
}
y llamarías así a la función
int fondo[2][2] = {{1,2},{2,2}}
tile.setMatrixTiles((int *)fondo,2,2);