Problema con crear una Pila Generica (y otras dudas) (ACTUALIZADO)

Iniciado por DarkSorcerer, 21 Septiembre 2013, 10:15 AM

0 Miembros y 1 Visitante están viendo este tema.

DarkSorcerer

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:

"/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 (cpp) [Seleccionar]
#include <cstdlib>
#include "Pila.h"

using namespace std;

int main(int argc, char** argv) {
   
   Pila<int> pila(10); //Creando una pila de enteros de 10 espacios

   return 0;
}



Código (cpp) [Seleccionar]
#ifndef PILA_H
#define PILA_H

template <class T>
class Pila {
public:
   
   Pila(int t);
   Pila(const Pila& orig);
   virtual ~Pila();
   void push(T e);
   T pop();
   bool isEmpty();
   bool isFull();
   
private:
   
   int tam; // El tamanio del arreglo
   int top; // La posicion del ultimo elemento
   T *arreglo;

};

#endif /* PILA_H */



Código (cpp) [Seleccionar]
#include "Pila.h"
#include <iostream>

template <class T>
Pila<T>::Pila(int t) {
   
   this->tam = t;
   this->top = -1;
   this->arreglo = new T[tam];
   
}

template <class T>
Pila<T>::Pila(const Pila& orig) {
   
   // Por implementar
   
}

template <class T>
Pila<T>::~Pila() {
   
   delete []arreglo;
   
}

/*
* Funcion que agrega un elemento a la pila.
*/

template <class T>
void Pila<T>::push(T e){
   
   if(isFull()){
       
       //cout << "\nLa pila esta llena\n";
       
   }else{
       
       arreglo[++top] = e;
       
   }
   
}

/**
* Funcion que obtiene un elemento de la pila.
* @return El elemento que esta el tope de la pila.
*/

template <class T>
T Pila<T>::pop(){
   
   if(isEmpty()){
       
       //cout << "\nLa pila esta vacia\n";
       
   }else{
       
       return arreglo[top--];
       
   }
}

/*
* Funcion que revisa si la pila esta vacia
*/

template <class T>
bool Pila<T>::isEmpty(){
   
   if(top == -1){
       
       return true;
       
   }
   
}

/*
* Funcion que revisa si la pila esta llena
*/

template <class T>
bool Pila<T>::isFull(){
   
   if(top == tam){
       
       return true;
       
   }
   
}


0xDani

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

DarkSorcerer

Cita de: 0xDani en 22 Septiembre 2013, 14:52 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

eferion

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.

DarkSorcerer

Cita de: 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.
¿ Entonces debo implementar todo en el .h ?


DarkSorcerer

Gracias, ahora pude solucionar mi problema y logré el resultado que quería.