<div dir="ltr">uf, Steven, muchísimas gracias por todos tus apuntes.<div><br></div><div>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.</div><div><br></div><div>De veras, muchas gracias por tu esfuerzo y tiempo desinteresado.</div><div><br></div><div>De momento comparto esta duda en relación a lo que indicaste arriba.</div><div><br></div><div>He probado a usar :</div><div><br></div><div><span style="font-size:12.8000001907349px"><font color="#3d85c6">// Get</font></span></div><div class="gmail_extra" style="font-size:12.8000001907349px"><font color="#3d85c6">const T & operator [] ( std::vector<T>::size_type index) const</font>;</div><div class="gmail_extra" style="font-size:12.8000001907349px"><br></div><div class="gmail_extra" style="font-size:12.8000001907349px">Pero me funciona si le coloco <b><i>typename </i></b>delante : ( aunque no entiendo muy bien todo eso )</div><div class="gmail_extra" style="font-size:12.8000001907349px"><br></div><div class="gmail_extra" style="font-size:12.8000001907349px"><div class="gmail_extra" style="font-size:12.8000001907349px"><font color="#3d85c6">// Get</font></div><div class="gmail_extra" style="font-size:12.8000001907349px"><font color="#3d85c6">const T & operator [] (typename std::vector<T>::size_type index) const;</font></div><div class="gmail_extra" style="font-size:12.8000001907349px"><font color="#3d85c6"><br></font></div><div class="gmail_extra" style="font-size:12.8000001907349px"><font color="#444444">Saludos.</font></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">El 5 de abril de 2015, 15:34, Davidson, Steven <span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hola Miguel Ángel,<br><div class="gmail_extra"><br></div><div class="gmail_extra">Sólo veo un error en el destructor, que explico más abajo. Antes de llegar al destructor, hay algunos matices a destacar.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- 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()'.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- Deberías usar 'vector :: size_type' como el tipo de dato en lugar de 'size_t', aunque seguramente internamente se defina como 'size_t'.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- Si, por la razón que sea, usas 'vector_size', entonces usa tu propia función miembro, 'size()'.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- El constructor debería inicializar correctamente los datos miembro, especialmente el puntero, 'begin', al igual que 'vector_size', si lo usas.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- En la sobrecarga del operador[], invocas 'resize()' de esta manera:</div><div class="gmail_extra"><br></div><div class="gmail_extra">resize( sizeof(T) * 100 );<br><br>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.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- 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,</div><div class="gmail_extra"><br></div><div class="gmail_extra">// Get</div><div class="gmail_extra">const T & operator [] ( std::vector<T>::size_type index) const;<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">// Set</div><div class="gmail_extra">T & operator [] ( std::vector<T>::size_type index);<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">- 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,</div><div class="gmail_extra"><br></div><div class="gmail_extra">Object_Pool<T> & operator = ( const std::vector<T> & other_object_vector )</div><div class="gmail_extra">{</div><div class="gmail_extra">  ...</div><div class="gmail_extra">  return this;<br>}</div><div class="gmail_extra"><br></div><div class="gmail_extra">Así podemos usar el operador = en cualesquier expresiones.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- En esta sobrecarga, escribes:<br><br>begin = (T*)objects_vector.data();<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">No es necesario realizar un cásting, ya que 'data()' retorna un puntero del tipo correcto.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- La función miembro, 'size()', debería ser constante, ya que no modifica el objeto.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- 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,</div><div class="gmail_extra"><br></div><div class="gmail_extra">const T * data() const;<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">- En C++, no necesitas indicar 'void' para una lista vacía de parámetros. Simplemente escribe:<br><br></div><div class="gmail_extra">~Object_Pool();<br><br>- 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.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Espero que esto te oriente.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Steven</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">2015-04-04 8:18 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <span dir="ltr"><<a href="mailto:miguelangeltorresfp@gmail.com" target="_blank">miguelangeltorresfp@gmail.com</a>></span>:<div><div class="h5"><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hola, buenos días a todos.<div><br></div><div>Quizá me estoy metiendo en algo demasiado complejo para mi nivel.</div><div><br></div><div>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.</div><div><br></div><div>pool<object> object_vector( 32 );</div><div><br></div><div>object_vector[50] = . . . ;</div><div><br></div><div>Adjunto el código que tengo.</div><div>El problema es que al hacer el resize del vector me da problemas en algunos casos y no sé por qué.</div></div></blockquote></div></div></div></div></div>
<br>_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br></blockquote></div><br></div>