[C con Clase] Buenos días, tengo un problema con pool de objetos.

Miguel Ángel Torres Fernández-Píñar miguelangeltorresfp en gmail.com
Mie Abr 8 06:53:25 CEST 2015


uf, Steven, muchísimas gracias por todos tus apuntes.

Me sirve muchísimo todo esto y me hace darme cuenta del enorme camino que
me queda aun por delante siquiera para ser un programador junior.

De veras, muchas gracias por tu esfuerzo y tiempo desinteresado.

De momento comparto esta duda en relación a lo que indicaste arriba.

He probado a usar :

// Get
const T & operator [] ( std::vector<T>::size_type index) const;

Pero me funciona si le coloco *typename *delante : ( aunque no entiendo muy
bien todo eso )

// Get
const T & operator [] (typename std::vector<T>::size_type index) const;

Saludos.

El 5 de abril de 2015, 15:34, Davidson, Steven <srd4121 en njit.edu> escribió:

> Hola Miguel Ángel,
>
> Sólo veo un error en el destructor, que explico más abajo. Antes de llegar
> al destructor, hay algunos matices a destacar.
>
> - Si vas a usar 'vector', entonces no necesitas guardar 'vector_size', ya
> que 'vector' ofrece esta funcionalidad a través de su función miembro,
> 'size()'.
>
> - Deberías usar 'vector :: size_type' como el tipo de dato en lugar de
> 'size_t', aunque seguramente internamente se defina como 'size_t'.
>
> - Si, por la razón que sea, usas 'vector_size', entonces usa tu propia
> función miembro, 'size()'.
>
> - El constructor debería inicializar correctamente los datos miembro,
> especialmente el puntero, 'begin', al igual que 'vector_size', si lo usas.
>
> - En la sobrecarga del operador[], invocas 'resize()' de esta manera:
>
> resize( sizeof(T) * 100 );
>
> Pasas una cantidad variable según el tamaño (en bytes) del tipo de dato.
> Ten presente que no estamos manejando bytes sino cantidades de elementos.
>
> - En general, deberías crear funciones miembro para obtener (get) y para
> modificar (set) datos internos. Esto implica que la función 'get' es
> constante, mientras que la de tipe 'set' es modificable. En tu caso,
> tendrías,
>
> // Get
> const T & operator [] ( std::vector<T>::size_type index) const;
>
> // Set
> T & operator [] ( std::vector<T>::size_type index);
>
> - La sobrecarga del operador de asignación debería retornar "este objeto"
> en lugar de no retornar nada. Recuerda que se trata de un operador y por
> tanto debería comportarse como un operador conocido. Esto es,
>
> Object_Pool<T> & operator = ( const std::vector<T> & other_object_vector )
> {
>   ...
>   return this;
> }
>
> Así podemos usar el operador = en cualesquier expresiones.
>
> - En esta sobrecarga, escribes:
>
> begin = (T*)objects_vector.data();
>
> No es necesario realizar un cásting, ya que 'data()' retorna un puntero
> del tipo correcto.
>
> - La función miembro, 'size()', debería ser constante, ya que no modifica
> el objeto.
>
> - Si la función miembro, 'data()', es constante, entonces debe retornar un
> puntero a un objeto constante, ya que se podría modificar los datos
> apuntados; esto es,
>
> const T * data() const;
>
> - En C++, no necesitas indicar 'void' para una lista vacía de parámetros.
> Simplemente escribe:
>
> ~Object_Pool();
>
> - Aquí tienes el único error que veo en el destructor, ya que intentas
> liberar la memoria que gestiona internamente 'objects_vector'. Como no
> creaste la memoria tú mismo, no deberías hacerte cargo de
> liberarla. Elimina este destructor, ya que no necesitas hacer nada antes de
> que este objeto deje de existir.
>
>
> Espero que esto te oriente.
>
> Steven
>
>
> 2015-04-04 8:18 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <
> miguelangeltorresfp en gmail.com>:
>
> Hola, buenos días a todos.
>>
>> Quizá me estoy metiendo en algo demasiado complejo para mi nivel.
>>
>> Quiero diseñar una clase que incluya como atributo un vector de objetos,
>> que inicialice este vector con un tamaño determinado y que luego me permita
>> hacer asignaciones de una manera segura. Que si el índice de la asignación
>> supera el tamaño del vector, que este aumente el tamaño al doble por
>> ejemplo.
>>
>> pool<object> object_vector( 32 );
>>
>> object_vector[50] = . . . ;
>>
>> Adjunto el código que tengo.
>> El problema es que al hacer el resize del vector me da problemas en
>> algunos casos y no sé por qué.
>>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150408/8e54608d/attachment.html>


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