[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