<div dir="ltr">Hola Miguel Ángel,<div class="gmail_extra"><br><div class="gmail_quote">2013/12/30 Miguel Ángel Torres Fernández-Píñar <span dir="ltr"><<a href="mailto:miguelangeltorresfp@gmail.com" target="_blank">miguelangeltorresfp@gmail.com</a>></span><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"><div><div>Buenos días Steven.<br><br></div>
Más o menos entiendo la idea. Lo que me cuesta ahora es saberlo aplicar en la práctica.<br><br></div><div>Y me doy cuenta de que lo que me falta es la base.<br><br>

</div><div>No tengo claro cuándo debo definir atributos ( miembros de una clase ) como punteros a objetos ( en este caso con Shared_Ptr ) o como variables de objetos.<br><br></div><div>Si los atributos son definidos como variables de objetos, aunque no lo haga yo explicitamente, la clase los crea en el constructor, no ???<br>

<br></div></div></blockquote><div><br></div><div>Realmente, esos miembros objeto son creados en la lista inicializadora del constructor. Si no existe tal lista inicializadora, entonces justo antes de entrar en el cuerpo de la función (del constructor), los miembros son instanciados en el orden de aparición. Por ejemplo,</div>
<div><br></div><div>class B {...};</div><div><br></div><div>class Algo<br>{<br><div>private:</div>  string str;</div><div>  B obj;</div><div>  int n;</div><div><br></div><div>public:</div><div>  Algo()  {}</div><div>};</div>
<div><br></div><div>Esto significa que primero 'str' es instanciado, según su constructor (sin parámetros), luego 'obj'. y por último se crea 'n'.</div><div><br></div><div>Otro ejemplo, con una lista inicializadora,</div>
<div><br></div><div><div>class B</div><div>{</div><div>private:</div><div>  float f;</div><div><br></div><div>public:</div><div>  B( float ff=-1.0f ) : f(ff)  {}</div><div>};</div></div><div><br></div><div><div>class Algo<br>
{<br><div>private:</div>  string str;</div><div>  B obj;</div><div>  int n;</div><div><br></div><div>public:</div><div>  Algo() : str("hola mundo"), obj(10.2f), n(1)  {}</div><div>};</div></div><div><br></div><div>
En ambos casos, un objeto de 'Algo' guarda estos tres miembros en memoria contigua, por lo que ocupará un mínimo de 12 bytes, dependiendo de lo que ocupen los miembros.</div><div><br></div><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"><div></div><div>Y si son definidos como punteros, entonces puedo crearlos yo cuando y donde quiera, no ???<br><br></div></div></blockquote><div><br></div><div>Correcto. Agrego lo que comenté en mis primeras respuestas a tus correos-e, para usar polimorfismo, necesitamos punteros a objetos o referencias a objetos. Personalmente, los punteros son más flexibles, así que aconsejo usarlos para este caso.<br>
</div><div><br></div><div>Otro uso puede ser a la hora de manipular objetos que existan en otra parte de tu programa, por lo que no quieres crear copias. La solución es usando punteros para apuntar a tales objetos. Podrías usar referencias, pero como dije antes, los punteros ofrecen mayor flexibilidad porque existe el puntero nulo mientras que la referencia nula no existe, en C++. Esto viene a ser lo que leíste o te comentaron acerca del uso de 'shared_ptr'. El ejemplo es a la hora de cargar y usar recursos comunes y compartidos, como por ejemplo, imágenes, sonidos, texto, etc.. Por ejemplo,</div>
<div><br></div><div>class Imagen {...};</div><div>class Sonido {...};<br></div><div>class Texto {...};<br></div><div><br></div><div>class Aplicacion<br>{<br>protected:<br>  Imagen *pImagen;<br>  Sonido *pSonido;<br>  Texto *pTexto;</div>
<div><br></div><div>public:<br>  Aplicacion( Imagen *pi, Sonido *ps, Texto *pt ) : pImagen(pi), pSonido(ps), pTexto(pt)  {}<br>};</div><div><br></div><div>Estamos realizando copias poco profundas, porque sólo queremos apuntar a objetos que ya existan en otra parte.</div>
<div><br></div><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"><div></div><div>Y no entendí esto :<div class="im">
<br><br><div><span style="color:rgb(61,133,198)">Siempre nos interesa construir el puntero compartido; así que haz esto:<br>
<br>shared_ptr<int> sp = new int;</span></div><div><br></div></div><div>¿ Con tipos básicos como int también se debe de usar Shared_Ptr ???, es decir, usar punteros ???.<br></div><div>Porque yo estoy usando constantemente variables de tipo int como atributos de las diferentes clases que creo. Es decir, no los creo con "new".<br>

<br></div></div></div></blockquote><div><br></div><div>No debes hacer nada que no quieras :)  Puedes usar un puntero a 'int', si quieres, pero nadie te impone que lo hagas. Lo que puse no era más que un ejemplo, para no tener que crear una clase y usarla en 'shared_ptr'. Personalmente, dudo que vayas a necesitas 'shared_ptr' directamente para un puntero a 'int'. Lo que sí puede ocurrir es usar un 'vector<int>' y posiblemente un puntero a tal clase; por ejemplo,</div>
<div><br></div><div>shared_ptr< vector<int> > spvi = new vector<int>;<br></div><div><br></div><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"><div><div></div><div>Y supongo que en tal caso sería así, no ???<br><span style="color:rgb(61,133,198)">shared_ptr<int> sp = <shared_ptr>( new int);</span><br><br></div></div></div></blockquote>
<div><br></div><div>Como mencioné en mi correo-e anterior, esto sería,</div><div><br></div><div><span style="font-family:arial,sans-serif;font-size:13px">shared_ptr<int> sp = new int;</span><br></div><div><br></div>
<div>El problema de este ejemplo es que no es muy práctico. No hacemos mucho con un puntero a un solo 'int'; convendría una lista de 'int'.</div><div><br></div><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"><div><div></div><div>En fin, Steven, no te preocupes mucho, supongo que necesito tiempo para irme aclarando con todo esto.<br></div></div></div></blockquote><div><br></div><div>Esto tiene que ver con los usos prácticos de los punteros. Las plantillas-clase que comenté en el correo-e anterior sirven para automatizar el uso del puntero y protegerlo a través del uso de un objeto. No tienes por qué usar 'shared_ptr' ni las demás plantillas si no quieres.</div>
<div><br></div><div><br></div><div>Espero que esto te oriente.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>