[C con Clase] Cambiar el tipo de un puntero, p.ej de int* a int**, en runtime
Steven Davidson
srd4121 en njit.edu
Sab Ago 23 20:59:46 CEST 2008
Hola Carles,
carles wrote:
> Hola a todos
>
> Quiero trabajar con una matriz de n dimensiones
>
> matriz[0][1]...[n-1]
>
> Pero la dimension de la matriz se conoce en ejecución y no en tiempo
> de compilación. Esta matriz está dentro de una clase y antes de
> recurrir a hacer una clase por cada dimensión me gustaría saber si
> puedo cambiar el tipo de matriz para que se pueda reservar espacio
> segun la dimensión que tenga.
>
> Lo que he estado intentando es definir la matriz como un puntero
>
> int *matriz;
>
> y después intentar cambiar el tipo de matriz a int**, int***, para
> las diferentes dimensiones, para poder reservar espacio dinamicamente
> con el operador new.
>
Puedes cambiar el tipo del valor pero no el tipo de la variable,
'matriz'. Si declaras 'matriz' como 'int *', 'int *' se quedará para
siempre.
> He intentado cosas tipo
>
> matriz=reinterpret_cast<int**>(matriz);
> matriz=dynamic_cast<int**>(matriz);
> ...
> etc
>
Obviamente, tienes un error aquí, porque estás intentando asignar un
valor de tipo 'int **' a 'matriz' cuyo tipo es 'int *'. Lo que sí
podrías hacer es crear otra variable del "nuevo" tipo que quieres. Por
ejemplo,
int **m2 = reinterpret_cast< int** >( matriz );
> La conversion explicita no funciona y ninguna de las pruebas que he
> hecho con dynamic_cast, reinterpret_cast, etc ha funcionado.
>
El operador 'dynamic_cast<>' no sirve para lo que quieres hacer, ya que
se basa en jerarquías de clases polimórficas.
> La idea es usar un switch que cambie el tipo de "matriz" dependiendo
> de las dimensiones.
>
Entonces, esto significa que no puedes declarar y asignar otra variable,
porque no sabes el tipo exacto en tiempo de compilación. La otra
posibilidad es realizar todas las tareas dentro de cada 'case'. Por ejemplo,
switch( ... )
{
case 1:
{
int *matriz;
...
}
break;
case 2:
{
int **matriz;
...
}
break;
case 3:
{
int ***matriz;
...
}
break;
case 4:
{
int ****matriz;
...
}
break;
}
Si esto no es posible, entonces sugiero implementar clases. Si tampoco
es algo que quieras hacer, entonces te queda emular una tabla
multidimensional con un 'int *'. Por ejemplo,
int *matriz = new int[8*3*10]; // matriz de 8x3x10
Tendrías que calcular los índices para tratar la matriz como si fuera un
array de tres dimensiones.
Espero que esto te aclare la duda.
Steven
Más información sobre la lista de distribución Cconclase