Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DarkSorcerer en 21 Septiembre 2013, 10:15 am



Título: Problema con crear una Pila Generica (y otras dudas) (ACTUALIZADO)
Publicado por: DarkSorcerer en 21 Septiembre 2013, 10:15 am
Estoy tratando de crear un Pila Generica, que me pueda almacenar todo tipo de datos, por ejemplo, poder crear una pila de enteros, otra de doubles, otra de floats, etc, vi que es necesario usar templates, estaba siguiendo el ejemplo de un libro cuyo autor se llama "Ellis Horowitz" pero la verdad que no lo veo muy explicativo, se salta muchos pasos, estaba buscando en otro sitio pero no puedo resolver la duda, ojala alguien me ayude.
Se me olvido decir que en la clase Pila no me deja mensajes con el "cout", me detecta error, ¿ a que se debera ? Lo deje como comentario.

Bueno, en este foro mucha gente me ha sacado de apuros, se los agradezco, ojala tambien en esta pueda salir, saltar de Java a C++ me fue un poco dificil, ahora pongo el codigo

Lo que me sale en la ventana de comandos:

Código:
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin_4.x-Windows/repaso39.exe
make[2]: Entering directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
mkdir -p build/Debug/Cygwin_4.x-Windows/_ext/931385675
rm -f build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o.d
g++    -c -g -MMD -MP -MF build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o.d -o build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o ../Repaso39/Pila.cpp
mkdir -p dist/Debug/Cygwin_4.x-Windows
g++     -o dist/Debug/Cygwin_4.x-Windows/repaso39 build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o  build/Debug/Cygwin_4.x-Windows/main.o
build/Debug/Cygwin_4.x-Windows/main.o: In function `main':
/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39/main.cpp:8: undefined reference to `Pila<int>::Pila(int)'
/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39/main.cpp:10: undefined reference to `Pila<int>::~Pila()'
collect2: error: ld returned 1 exit status
nbproject/Makefile-Debug.mk:63: recipe for target `dist/Debug/Cygwin_4.x-Windows/repaso39.exe' failed
make[2]: *** [dist/Debug/Cygwin_4.x-Windows/repaso39.exe] Error 1
make[2]: Leaving directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
nbproject/Makefile-Debug.mk:60: recipe for target `.build-conf' failed
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
nbproject/Makefile-impl.mk:39: recipe for target `.build-impl' failed
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2,, total time: 5s)

Ahora el codigo

Código
  1. #include <cstdlib>
  2. #include "Pila.h"
  3.  
  4. using namespace std;
  5.  
  6. int main(int argc, char** argv) {
  7.  
  8.    Pila<int> pila(10); //Creando una pila de enteros de 10 espacios
  9.  
  10.    return 0;
  11. }
  12.  
  13.  

Código
  1. #ifndef PILA_H
  2. #define PILA_H
  3.  
  4. template <class T>
  5. class Pila {
  6. public:
  7.  
  8.    Pila(int t);
  9.    Pila(const Pila& orig);
  10.    virtual ~Pila();
  11.    void push(T e);
  12.    T pop();
  13.    bool isEmpty();
  14.    bool isFull();
  15.  
  16. private:
  17.  
  18.    int tam; // El tamanio del arreglo
  19.    int top; // La posicion del ultimo elemento
  20.    T *arreglo;
  21.  
  22. };
  23.  
  24. #endif /* PILA_H */
  25.  
  26.  

Código
  1. #include "Pila.h"
  2. #include <iostream>
  3.  
  4. template <class T>
  5. Pila<T>::Pila(int t) {
  6.  
  7.    this->tam = t;
  8.    this->top = -1;
  9.    this->arreglo = new T[tam];
  10.  
  11. }
  12.  
  13. template <class T>
  14. Pila<T>::Pila(const Pila& orig) {
  15.  
  16.    // Por implementar
  17.  
  18. }
  19.  
  20. template <class T>
  21. Pila<T>::~Pila() {
  22.  
  23.    delete []arreglo;
  24.  
  25. }
  26.  
  27. /*
  28.  * Funcion que agrega un elemento a la pila.
  29.  */
  30.  
  31. template <class T>
  32. void Pila<T>::push(T e){
  33.  
  34.    if(isFull()){
  35.  
  36.        //cout << "\nLa pila esta llena\n";
  37.  
  38.    }else{
  39.  
  40.        arreglo[++top] = e;
  41.  
  42.    }
  43.  
  44. }
  45.  
  46. /**
  47.  * Funcion que obtiene un elemento de la pila.
  48.  * @return El elemento que esta el tope de la pila.
  49.  */
  50.  
  51. template <class T>
  52. T Pila<T>::pop(){
  53.  
  54.    if(isEmpty()){
  55.  
  56.        //cout << "\nLa pila esta vacia\n";
  57.  
  58.    }else{
  59.  
  60.        return arreglo[top--];
  61.  
  62.    }
  63. }
  64.  
  65. /*
  66.  * Funcion que revisa si la pila esta vacia
  67.  */
  68.  
  69. template <class T>
  70. bool Pila<T>::isEmpty(){
  71.  
  72.    if(top == -1){
  73.  
  74.        return true;
  75.  
  76.    }
  77.  
  78. }
  79.  
  80. /*
  81.  * Funcion que revisa si la pila esta llena
  82.  */
  83.  
  84. template <class T>
  85. bool Pila<T>::isFull(){
  86.  
  87.    if(top == tam){
  88.  
  89.        return true;
  90.  
  91.    }
  92.  
  93. }
  94.  
  95.  


Título: Re: Problema con crear una Pila Generica (y otras dudas)
Publicado por: 0xDani en 22 Septiembre 2013, 14:52 pm
Cuáles son los errores que te da el compilador?


Título: Re: Problema con crear una Pila Generica (y otras dudas)
Publicado por: DarkSorcerer en 28 Septiembre 2013, 16:48 pm
Cuáles son los errores que te da el compilador?
Actualice el tema, donde puse los errores que me dió el compilador.
Uso Netbeans 7.3


Título: Re: Problema con crear una Pila Generica (y otras dudas) (ACTUALIZADO)
Publicado por: eferion en 28 Septiembre 2013, 18:00 pm
Primer consejo al hacer templates... TODO y repito TODO el código de un template tiene que estar en el archivo de cabecera.

La razón es que el compilador utiliza este template para generar el código específico que necesite según se vaya usando en la aplicación.

Es decir, si tu en un programa usas la pila solo para tipos int, se creará código específico únicamente para el tipo int... si usas la pila para int, float y double... se creará una clase específica para cada uno de esos tres tipos.

El código de un template, como tal, no se compila directamente, se genera bajo demanda... el código en el cpp no sirve para nada.


Título: Re: Problema con crear una Pila Generica (y otras dudas) (ACTUALIZADO)
Publicado por: DarkSorcerer en 28 Septiembre 2013, 20:00 pm
Primer consejo al hacer templates... TODO y repito TODO el código de un template tiene que estar en el archivo de cabecera.

La razón es que el compilador utiliza este template para generar el código específico que necesite según se vaya usando en la aplicación.

Es decir, si tu en un programa usas la pila solo para tipos int, se creará código específico únicamente para el tipo int... si usas la pila para int, float y double... se creará una clase específica para cada uno de esos tres tipos.

El código de un template, como tal, no se compila directamente, se genera bajo demanda... el código en el cpp no sirve para nada.
¿ Entonces debo implementar todo en el .h ?


Título: Re: Problema con crear una Pila Generica (y otras dudas) (ACTUALIZADO)
Publicado por: eferion en 28 Septiembre 2013, 20:10 pm
si


Título: Re: Problema con crear una Pila Generica (y otras dudas) (ACTUALIZADO)
Publicado por: DarkSorcerer en 28 Septiembre 2013, 23:43 pm
Gracias, ahora pude solucionar mi problema y logré el resultado que quería.