2009-03-05 11 views
5

¿Hay alguna forma de retrasar la definición del tamaño de una matriz hasta un método de clase o un constructor?¿Retrasar el tamaño de la matriz en la definición de clase en C++?

Lo que estoy pensando que podría ser algo como esto, que (por supuesto) no funciona:

class Test 
{ 
    private: 
    int _array[][]; 

    public: 
    Test::Test(int width, int height); 
}; 

Test::Test(int width, int height) 
{ 
    _array[width][height]; 
} 

Respuesta

8

Lo que Daniel está diciendo es que tendrá que asignar memoria a su matriz dinámicamente cuando se llame al método de prueba (ancho, alto).

Se podría declarar su bidimensional como esto (suponiendo matriz de enteros):

int ** _array; 

Y luego, en el método de prueba que se necesita para asignar primero la matriz de punteros, y luego para cada puntero de asignar una matriz de números enteros:

_array = new *int [height]; 
for (int i = 0; i < height; i++) 
{ 
    _array [i] = new int[width]; 
} 

Y luego, cuando se libera el objeto, tendrá que eliminar explícitamente la memoria que ha asignado.

for (int i = 0; i < height; i++) 
{ 
    delete [] _array[i]; 
    _array [i] = NULL; 
} 
delete [] _array; 
_array = NULL; 
+0

podría añadir el puntero de asignación de matriz: _array = new int [altura ]; ¡Upvoted por proporcionar la fuente sin embargo! –

+0

Vaya. Gracias Daniel. Olvide añadir eso :). Aclamaciones. – RedBlueThing

+0

El problema con la administración manual de matrices es el hecho de que necesita crear sus propios constructores de copia/operator = o hacer que la clase explícitamente no se pueda copiar para evitar problemas futuros – Artyom

2

Creo que es el momento para que usted mire el nuevo/borrar los operadores.

En vista de que esta es una matriz multidimensional, vas a tener que recorrer llamar 'nuevo' sobre la marcha (y otra vez para no olvidar: borrar).

Aunque estoy seguro de que muchos sugerirán usar una matriz unidimensional con elementos de ancho * alto.

8

vector es su mejor amigo

class Test 
{ 
    private: 
    vector<vector<int> > _array; 

    public: 
    Test(int width, int height) : 
     _array(width,vector<int>(height,0)) 
    { 
    } 
}; 
+1

Artyom tiene toda la razón. Ahórrate un montón de dolor :) Sin embargo, creo que es bueno entender los principios subyacentes. – RedBlueThing

+0

En términos de estructuras de datos, parece que un vector sigue siendo estructuralmente una matriz pero envuelto en una clase. ¿Sí? – slythfox

+0

Sí, la mayoría de las implementaciones vectoriales usan matrices "detrás de escena", creo. También puede usar los operadores de matriz para manipular un vector. – gnud

1

(Meses más tarde) se puede utilizar plantillas, así:

// array2.c 
// http://www.boost.org/doc/libs/1_39_0/libs/multi_array/doc/user.html 
// is professional, this just shows the principle 

#include <assert.h> 

template<int M, int N> 
class Array2 { 
public: 
    int a[M][N]; // vla, var-len array, on the stack -- works in gcc, C99, but not all 

    int* operator[] (int j) 
    { 
     assert(0 <= j && j < M); 
     return a[j]; 
    } 

}; 

int main(int argc, char* argv[]) 
{ 
    Array2<10, 20> a; 
    for(int j = 0; j < 10; j ++) 
    for(int k = 0; k < 20; k ++) 
     a[j][k] = 0; 

    int* failassert = a[10]; 

} 
Cuestiones relacionadas