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

Davidson, Steven srd4121 en njit.edu
Dom Abr 5 15:34:01 CEST 2015


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é.
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150405/947e32c3/attachment.html>


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