PDA

View Full Version : [C++]Stack


Luc@s
02-12-2003, 14:44
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>

using namespace std;

template<class T>
class Stack
{
public:
// Constructor with dimension
Stack(int dim) { vet = new T[checkDim(dim)]; };
// Constructor without dimension
Stack() { vet = new T[5]; };
// Check and verify the chosed dimensione
int checkDim(int dim) { return(dim <= 0)?5:dim; };
// The destructor
~Stack(){};
// add a element
void push(T value) { vet[sp++] = value; };
// return a element (and no delete)
T pop() { return vet[sp--]; };
// return a element (and delete)
T pop_d()
{
int index =sp--;
T tmp = vet[index];
delete vet[index];
return tmp;
};
private:
T vet;
int sp;
};



Mi da (riga in neretto):
P:/C++/stack/stack.h:21: invalid types `int[int]' for array subscript
Tnk 100000000000

Molz
03-12-2003, 09:12
Penso ke l'errore venga xké vet é dikiarato come un elemento di tipo T e nn come un vettore di T o un puntatore a T.

A qesto punto nn capisco xké nn t da errore il costruttore.

Cmq prova a sostituire

private:
T vet;
int sp;

con

private:
T * vet;
int sp;

cionci
03-12-2003, 20:26
Oltre a quello segnalato...

delete vet[index];

Questo non si può fare...non puoi cancellare uno alla volta gli elementi di un vettore allocati tutti insieme...

I due costruttori li metterei in uno solo (e mancava l'inizializzazione di sp e di un'altra variabile membro che ti tiene la dimensione, altrimenti puoi andare inoverflow):

Stack(int d = 5):dim(d),sp(0) { vet = new T[checkDim(dim)]; };

Sulla push devi controllare se sp >= dim...e in tal caso devi generare un'eccezione...
Sulla pop devi controllare se sp < 1...e in tal caso devi generare un'eccezione...
La pop è sbagliata...se fai la push così:

vet[sp++] = value;

allora devi fare la pop così:

return vet[--sp];

checkDim la metterei come privata...

verloc
04-12-2003, 12:22
E' buona norma inoltre,indicizzare un qualsiasi container con unsigned int.
...se uno fa container[-3] ?

ciao ;)