• Jueves 14 de Noviembre de 2024, 17:20

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Karit

Páginas: [1]
1
C/C++ / Duda con Plantillas[C++]
« en: Jueves 30 de Diciembre de 2010, 04:59 »
Hola Buenas Noches a Todos!!

Tengo una duda acerca de las templates en C++.
Despues de leer varios tutoriales, por fin pude crear por mi cuenta una Lista Simplemente Enlazada utilizando plantillas y dos clases(Nodo y Lista).

Mi pregunta es:
¿Por que cuando tengo todo mi código junto en un solo archivo, cuando compilo y corro mi programa funciona perfecto, pero cuando separo el codigo en archivos de cabecera(.h y .cpp) mas el main.cpp mi compilador(g++) al momento del enlazado me tira varios errores?

Mi codigo TODO JUNTO el que si funciona es:
Código: Text
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. template <class Q>
  6. class Nodo{
  7.     private:
  8.         Q *MiDato;
  9.         Nodo<Q> *next;
  10.     public:
  11.         Nodo(Q nuevo){
  12.             next = NULL;
  13.             MiDato = new Q;
  14.             *MiDato = nuevo;
  15.         }
  16.         Nodo(void): MiDato(NULL), next(NULL) {}
  17.         ~Nodo(void){
  18.             delete MiDato;
  19.             next = NULL;
  20.         }
  21.         void set_data(Q nuevo){
  22.             MiDato = new Q;
  23.             *MiDato = nuevo;
  24.         }
  25.         void set_next(Nodo<Q> *s) { next = s; }
  26.         const Q get_data(void) const { return *MiDato; }
  27.         Nodo<Q> *get_next(void) { return next; }
  28.         void ShowAll(void) const{
  29.             Nodo<Q> *aux = next;
  30.  
  31.             cout << *MiDato << endl;
  32.             while(aux){
  33.                 cout << aux->get_data() << endl;
  34.                 aux = aux->get_next();
  35.             }
  36.         }
  37. };
  38.  
  39. template <class Q>
  40. class Lista{
  41.     private:
  42.         Nodo<Q> *inicio;
  43.         Nodo<Q> *final;
  44.         int tam;
  45.     public:
  46.         Lista(void): inicio(NULL), final(NULL), tam(0) {}
  47.         ~Lista(void){
  48.             Nodo<Q> *aux = inicio;
  49.  
  50.             if(!empty()){
  51.                 while(inicio){
  52.                     inicio = inicio->get_next();
  53.                     delete aux;
  54.                     aux = inicio;
  55.                 }
  56.             }
  57.             final = NULL;
  58.             tam = 0;
  59.         }
  60.         void add(Q nuevo){
  61.             Nodo<Q> *aux = new Nodo<Q>(nuevo);
  62.             if(empty()){
  63.                 inicio = aux;
  64.             }else{
  65.                 final->set_next(aux);
  66.             }
  67.             final = aux;
  68.             tam++;
  69.         }
  70.         int get_tam(void) const { return tam; }
  71.         bool empty(void) const{
  72.             return (inicio == NULL);
  73.         }
  74.         void Mostrar(void) const { inicio->ShowAll(); }
  75. };
  76.  
  77. int main(void){
  78.     Lista<int> Buena;
  79.     Lista<char> Mala;
  80.  
  81.     for(int i = 10; i < 21; i++){
  82.         Buena.add(i);
  83.     }
  84.     Mala.add('M');
  85.     Mala.add('A');
  86.     Mala.add('L');
  87.     Mala.add('A');
  88.  
  89.     cout << "Buena mide: " << Buena.get_tam() << endl;
  90.     Buena.Mostrar();
  91.     cout << "nMala mide: " << Mala.get_tam() << endl;
  92.     Mala.Mostrar();
  93.  
  94.     return 0;
  95. }
  96.  
  97.  

Y el error que me tira si creo los siguientes 5 archivos:
main.cpp, Nodo.cpp, Nodo.h, Lista.cpp y Lista.h
es:
Código: Text
  1.  
  2. $ g++ -c Nodo.cpp
  3. $ g++ -c Lista.cpp
  4. $ g++ main.cpp *.o
  5. /tmp/ccNbYLWk.o: In function `main':
  6. main.cpp:(.text+0x13): undefined reference to `Lista<int>::Lista()'
  7. main.cpp:(.text+0x1f): undefined reference to `Lista<char>::Lista()'
  8. main.cpp:(.text+0x39): undefined reference to `Lista<int>::add(int)'
  9. main.cpp:(.text+0x59): undefined reference to `Lista<char>::add(char)'
  10. main.cpp:(.text+0x6a): undefined reference to `Lista<char>::add(char)'
  11. main.cpp:(.text+0x7b): undefined reference to `Lista<char>::add(char)'
  12. main.cpp:(.text+0x8c): undefined reference to `Lista<char>::add(char)'
  13. main.cpp:(.text+0x98): undefined reference to `Lista<int>::get_tam() const'
  14. main.cpp:(.text+0xcc): undefined reference to `Lista<int>::Mostrar() const'
  15. main.cpp:(.text+0xd8): undefined reference to `Lista<char>::get_tam() const'
  16. main.cpp:(.text+0x10c): undefined reference to `Lista<char>::Mostrar() const'
  17. main.cpp:(.text+0x11d): undefined reference to `Lista<char>::~Lista()'
  18. main.cpp:(.text+0x130): undefined reference to `Lista<char>::~Lista()'
  19. main.cpp:(.text+0x144): undefined reference to `Lista<int>::~Lista()'
  20. main.cpp:(.text+0x160): undefined reference to `Lista<int>::~Lista()'
  21. collect2: ld devolvió el estado de salida 1
  22. $
  23.  
  24.  

¿Alguien me puede explicar que  sucede?

Páginas: [1]