[C con Clase] Pregunta sencilla de creo rápida respuesta.

Davidson, Steven srd4121 en njit.edu
Mar Abr 21 22:10:48 CEST 2015


Hola Miguel Ángel,

2015-04-21 13:21 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <
miguelangeltorresfp en gmail.com>:

> Gracias Steven.
>
> Más o menos me voy aclarando con punteros a un solo objeto, pero no lo
> tengo tan claro cuando se trata de una colección de objetos. Cuando por
> ejemplo hacemos uso de la clase vector de la librería estándar. En ese caso
> no tengo muy claro en qué casos es conveniente meter los objetos en el
> vector como referencias o como punteros inteligentes a dichos objetos.
>
>
Se trata más bien de las necesidades del diseño. Si guardas objetos,
entonces 'vector' instanciará varios de ellos. Al no tener control sobre la
instanciación, ni por tanto de la construcción, debemos asegurar que la
clase del objeto pueda construirse sin parámetros. Si esto es un problema,
entonces es mejor usar un vector de punteros para ir instanciando cada uno,
con su construcción apropiada; es decir, con los parámetros necesarios. Por
ejemplo,

class Algo
{
  ...
  Algo( const string &str, int n );
  Algo( float f );
};
...
std :: vector<Algo> lista1;  // Error: no existe 'Algo()'
std :: vector<Algo *> lista2;

lista2.push_back( new Algo("hola",4) );
lista2.push_back( new Algo("adios",5) );
lista2.push_back( new Algo(-2.34f) );
...

Porque un objeto de tipo vector se encarga de destruir los objetos que
> contiene. En ese caso si son punteros normales, qué hace, los destruye sin
> más, o hace un delete de los punteros ???.
>
>
No; 'vector' elimina la memoria relacionada con los objetos del tipo
indicado. No sabe absolutamente nada acerca de los punteros que guardes. Si
necesitas eliminar memoria dinámicamente, entonces el responsable eres tú.
He aquí la necesidad de usar punteros inteligentes. Al ser objetos de una
clase, sus destructores son invocados implícitamente, y en el caso de
punteros inteligentes, esto supone eliminar implícitamente el objeto
apuntado. Como dije antes, esta gestión se automatiza, y no hace falta ser
explícito.


Espero que todo esto te ayude.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150421/78878da1/attachment.html>


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