[C con Clase] sobre #
Pedro Mateo
pedromateoa en gmail.com
Vie Oct 17 02:00:54 CEST 2008
EEXXELLENTE
JEJEJE
NO LO HABIA VISTO DE ESA FORMA
GRACIAS
El día 16/10/08, Steven Davidson <srd4121 en njit.edu> escribió:
>
> Hola Pedro,
>
> Pedro Mateo wrote:
>
>> hola a todos
>> tengo la siguiente plantilla
>> template<typename DATA,const bool borrar_en_destructor=false>
>> class claseX{
>> DATA data; public:
>> claseX(const DATA& x):data(x){}
>> ~claseX(){
>> #if borrar_en_destructor==true
>> delete data;
>> #endif
>> }
>> }
>> como DATA puede ser cualquier tipo, pero si es un puntero puede darse
>> el caso de que yo desee que la clase le de un delete al puntero al
>> ser destruida la instancia
>> el codigo que he propuesto no funciona y me gustaria saber si estoy
>> haciendo algo que no se puede o estoy haciendo algo mal
>>
>>
>
> Efectivamente, tienes un error gramatical que está aquí:
>
> #if borrar_en_destructor==true
>
> Ten presente que # implica una directiva del precompilador y por tanto la
> expresión que sigue debe poder ser evaluado por el precompilador. La
> cosntante 'borrar_en_destructor' pertenece a C++ y no existe como tal en la
> precompilación; o sea, el precompilador no entiende lo que es
> 'borrar_en_destructor'. Podrías usar 'if' del lenguaje de C++ y no su
> homólogo, la directiva del precompilador #if. Esto es,
>
> ~claseX()
> {
> if( borrar_en_destructor ) delete data;
> }
>
>
> De todas maneras, no sugiero implementar este código de esta manera. En su
> lugar, define plantillas parcialmente especializadas. Como el problema es
> que el tipo de dato puede ser un puntero, entonces sugiero crear tal
> especialidad parcial. Esto es,
>
> template< typename DATA >
> class claseX
> {
> DATA data;
> public:
> claseX( const DATA& x ) : data(x) {}
> ~claseX() {}
> };
>
> template< typename DATA >
> class claseX< DATA * >
> {
> DATA *data;
> public:
> claseX( const DATA* x ) : data(0)
> {
> data = new DATA;
> *data = DATA(0); // Asignamos 0 al 'DATA' apuntado
> }
> ~claseX()
> {
> delete data;
> }
> };
>
>
> Si usamos un tipo de dato que es un puntero, entonces usamos la
> especialización parcial que hemos creado. Si el tipo del dato del argumento
> de la plantilla no es un puntero, entonces usamos la definición de la
> plantilla general.
>
>
> Espero que esto te sirva.
>
> Steven
>
>
> _______________________________________________
> 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/20081017/3f2401a5/attachment.html>
Más información sobre la lista de distribución Cconclase