[C con Clase] Consulta arreglo dinamico

Salvador Pozo salvapozo en gmail.com
Vie Jun 17 17:21:19 CEST 2016


El pasado 2016-06-17 07:45:55, Giuliano escribió:
 
G> Hola. Buenos dias. Me llamo Giuliano. Tengo una consulta a cerca de algo
G> que estoy diseñando. Estoy tratando de hacer un arreglo dinamico. Por el
G> momento es de Char, en C++, pero mas adelante con templates quiero hacerlo
G> para cualquier tipo. Mi problema es el siguiente:
G> Utilizo un puntero llamado "*rep" que hace de vector en la clase. La
G> variable "_size", deberia almacenar ( y por consiguiente, inicializarse
G> con... ) el tamaño total del arreglo; independientemente de si esta lleno,
G> vacio, o tiene algunos elementos. Es decir, quiero que esa variable tenga
G> todo el tiempo el tamaño del array. Pero al no poder pasar un arreglo
G> completo como parametro de una funcion, o "leer" el arreglo como tal y no
G> como un puntero, no puedo calcular su tamaño. Cada vez que intento
G> calcularlo, me devuelve el tamaño de un puntero. En el constructor sin
G> parametros, utilizo la siguiente linea "_size = sizeof( rep ) / sizeof(
G> Type ) ;" para inicializar _size, que en otros contextos me ha funcionado,
G> pero ahi solo me calcula, como dije anteriormente, el tamaño de un puntero.
G> Adjunto el codigo que hice para este problema puntual. Agradeceria mucho
G> cualquier tipo de ayuda. Muchas gracias desde ya y un saludo!


Hola:

El problema es que el operador sizeof aplicando a un puntero SIEMPRE te va a dar el tamaño del puntero. Tal como lo quieres utilizar sólo funcionará con arrays.

La alternativa es asignar a _size el tamaño real de tu array dinámico. Es decir, en el constructor sin parámetros será cero, en el constructor en que el parámetro es un puntero, el valor debe ser "index", tal como lo calculas.

Si hubiese un tercer constructor con el número máximo de elementos 'n', _size debería recibir el valor 'n'.

Tal como has diseñado el ejemplo, el segundo constructor sólo es válido si todos los elementos son distintos de cero, salvo el último. Esto puede ser correcto para arrays de char, siempre que se almacenen cadenas terminadas en cero, pero no sirve para arrays de otros tipos de objetos.

Yo usaría otro constructor con dos parámetros: el puntero al array, y el número de elementos que contiene. Cuando invoques ese constructor siempre podrás calcular o conocer el tamaño del array original, puesto que, o bien lo has creado tu mismo, o bien podrás aplicar el operador sizeof.

Hasta pronto.


Más información sobre la lista de distribución Cconclase