Grazie Skynet. Alla fine bisogna implementare sia dichiarazioni che definizioni del template nello stesso header file proprio perchè esso è istanziato staticamente. Ho provato con export ma il compilatore dev c++ non me la riconosce come parola chiave. Devo provare con eclipse...Un ultima domanda ma nell' header file ci posso mettere sempre le istruzioni #ifndef #define di precompilazione oppure meglio di no! Ad esempio questa classe pila template è scritta bene? (file Pila.h)
#ifndef PILA_H
#define PILA_H
using namespace std;
template <class Tipo>
class Pila
{
public:
Pila();
Pila (const unsigned int n); // costruttore che setta il massimo num. di elementi
~Pila();
void Svuotare();
void Immettere (const Tipo& x);
Tipo Estrarre();
Tipo Cima() const;
bool Vuota() const;
bool Piena() const;
void Stampa();
private:
unsigned int max; // numero massimo di elementi che può contenere la pila
unsigned int cima; // puntatore alla cima della pila
Tipo *valore; // array dinamico di elementi di tipo Tipo
};
template <class Tipo>
Pila <Tipo> :: Pila() : max(100), cima(0), valore(new Tipo[max]) {}
template <class Tipo>
Pila <Tipo> :: Pila(const unsigned int n) : max(n), cima(0), valore(new Tipo[max]) {}
template <class Tipo>
Pila <Tipo> :: ~Pila() { delete [] valore; }
template <class Tipo>
void Pila <Tipo> :: Svuotare() { cima = 0; }
template <class Tipo>
void Pila <Tipo> :: Immettere(const Tipo& x)
{
if (Piena())
cout << "Pila piena" << endl;
else
{
valore[cima] = x;
cima++;
}
}
template <class Tipo>
Tipo Pila <Tipo> :: Estrarre()
{
Tipo aux;
if (Vuota())
cout << "Pila vuota" << endl;
else
{
aux = valore[cima];
cima--;
return aux;
}
}
template <class Tipo>
Tipo Pila <Tipo> :: Cima() const { return valore[cima]; }
template <class Tipo>
bool Pila <Tipo> :: Vuota() const { return (cima == 0); }
template <class Tipo>
bool Pila <Tipo> :: Piena() const { return (cima >= max); }
template <class Tipo>
void Pila <Tipo> :: Stampa()
{
for (int i = 0; i < max; i++)
cout << valore[i] << " ";
cout << endl;
}
#endif
File main.cpp
#include <iostream>
#include <cstdlib>
#include "Pila.h"
using namespace std;
int main ()
{
Pila <int> p(5); // richiama il costruttore che imposta il max a 5
p.Immettere(1);
p.Immettere(5);
p.Immettere(7);
p.Immettere(9);
cout << "Lista: ";
p.Stampa();
cout << "Estraggo in testa..";
p.Estrarre();
p.Stampa();
cout << "Testa della pila: ";
cout << p.Cima() << endl;
system ("pause");
return 0;
}
Visto che ci sono il programma che ho fatto mi stampa 0 all'ultima posizione mentre voglio che non mi stampi niente se il vettore non è completo. E soprattutto la funzione Estrarre (pop) non mi riduce il vettore. Chiedo lumi. Grazie..Per gli altri post è tutto chiaro skynet...