Foros del Web » Programación para mayores de 30 ;) » C/C++ »

C++ y templates. No veo el error.

Estas en el tema de C++ y templates. No veo el error. en el foro de C/C++ en Foros del Web. Hola a todos. Hace tiempo que no vengo por aqui. Esta vez vengo por un poco de ayuda. Tengo el siguiente codigo para implementar un ...
  #1 (permalink)  
Antiguo 30/11/2008, 00:32
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
C++ y templates. No veo el error.

Hola a todos. Hace tiempo que no vengo por aqui.
Esta vez vengo por un poco de ayuda.

Tengo el siguiente codigo para implementar un arbol binario de manera orientado a objetos y usando templates.

Código PHP:
template<typename T>
class 
Arbol{
    protected:
        
Nodo<T> *raiz;
    public:
        
Arbol(){raiz=NULL;};
        
virtual ~Arbol()=0;
        
virtual void Insert(Nodo<Tnod)=0;
        
virtual void PreOrder(void)=0;
        
virtual void InOrder(void)=0;
        
virtual void PosOrder(void)=0;
};

template<typename T>
class 
ArbolEvaluacion : public Arbol<T>{
    protected:
    public:
        
ArbolEvaluacion();
        ~
ArbolEvaluacion();
        
void Insert(Nodo<Tnod);
        
void PreOrder(void);
        
void InOrder(void);
        
void PosOrder(void);
};
//////////////////////
template<typename T>
ArbolEvaluacion<T>::ArbolEvaluacion()
{
}

template<typename T>
ArbolEvaluacion<T>::~ArbolEvaluacion()
{
}

template<typename T>
void ArbolEvaluacion<T>::Insert(Nodo<Tnod)
{
}

template<typename T>
void ArbolEvaluacion<T>::PreOrder(void)
{
}

template<typename T>
void ArbolEvaluacion<T>::InOrder(void)
{
}

template<typename T>
void ArbolEvaluacion<T>::PosOrder(void)
{

Al intentarlo compilar con gcc v4 bajo linux me lanza que hay referencias indefinidas en los constructores. Depsues de mover algunas cosas me lanza lo mismo pero con todos los metodos.
Alguien podria explicarme que estoy haciendo mal, por favor?

Saludos
  #2 (permalink)  
Antiguo 01/12/2008, 22:24
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: C++ y templates. No veo el error.

Bueno, encontre una solucion. No se si sea la correcta, pero tras leer varios libros y articulos sobre los templates, llegue a la conclusion de que hay que meter un #include"implementacion.cpp" en la cabecera al igual que añadir unos #ifndefs
Con esto, todo compila y funciona bien:

Código PHP:
#ifndef ARBOL
#define ARBOL
template<typename T>
class 
Arbol{
    protected:
        
Nodo<T> *raiz;
    public:
        
Arbol(){raiz=NULL;};
        
virtual ~Arbol()=0;
        
virtual void Insert(Nodo<Tnod)=0;
        
virtual void PreOrder(void)=0;
        
virtual void InOrder(void)=0;
        
virtual void PosOrder(void)=0;
};

template<typename T>
class 
ArbolEvaluacion : public Arbol<T>{
    protected:
    public:
        
ArbolEvaluacion();
        ~
ArbolEvaluacion();
        
void Insert(Nodo<Tnod);
        
void PreOrder(void);
        
void InOrder(void);
        
void PosOrder(void);
};
#include"arbol.cpp"
#endif
//////////////////////
#include"arbol.h"
template<typename T>
ArbolEvaluacion<T>::ArbolEvaluacion()
{
}

template<typename T>
ArbolEvaluacion<T>::~ArbolEvaluacion()
{
}

template<typename T>
void ArbolEvaluacion<T>::Insert(Nodo<Tnod)
{
}

template<typename T>
void ArbolEvaluacion<T>::PreOrder(void)
{
}

template<typename T>
void ArbolEvaluacion<T>::InOrder(void)
{
}

template<typename T>
void ArbolEvaluacion<T>::PosOrder(void)
{

A ver si a alguien le llega a servir
  #3 (permalink)  
Antiguo 02/12/2008, 16:11
poi
 
Fecha de Ingreso: octubre-2008
Mensajes: 73
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: C++ y templates. No veo el error.

Tengo una pregunta sobre tu codigo, esque aun no estoy muy enterao de todo esto de las clases y eso.
Si en la clase base declaras el destructor como virtual puro, que se supone que no hace nada, ¿No abria que liberar la memoria del puntero raiz?

Gracias por adelantado.
  #4 (permalink)  
Antiguo 03/12/2008, 14:38
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: C++ y templates. No veo el error.

Pues no exactamente.

Como mi puntero es del tipo base, tengo que hacer el destructor virtual(no necesariamente puro) para que el operador delete trabaje con el tamaño correcto, que en este caso es el de la calse derivada. Y bueno, en caso de haber utilizado memoria en la clase derivada tambien liberarla.

Si el destructor no fuera virtual puro entonces se ejecutaria primero el destructor de la clase base y luego el de la derivada. Pero como no hay nada que hacer en la clase base pues por eso lo puse como virtual puro.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:36.