Newsgroup: it.comp.lang.c++
Titolo: Derivare una classe stack da vector

Come esercizio sulla programmazione C++ dovrei derivare una classe stack da
quella standard vector. Riporto qui la mia prima piccola bozza (e piů in
basso i problemi da risolvere):
#include <vector>
template <class T> class stack :
vector<T>
{
friend ostream& operator<< <T>(ostream&, const stack&);
public:
   void push(const T & item) { push_back(item); }
   void pop(T & item) { item=operator[](size()-1); }
};
template <class T> ostream&
operator<< (ostream& out, const stack<T>& stck)
{
cout << stck[stck.size()-1];
}
Il primo problema č evidente: il metodo pop dovrebbe prendere il primo
elemento disponibile dello stack (ovvero l'ultimo del vettore) e copiarlo
nell'oggetto che viene passato per riferimento. E fin qui ci siamo. Il
problema č che poi questo stesso elemento dovrebbe essere eliminato dallo
stack, ma, semplicemente, non so come si fa. A tal proposito, oltre a un
suggerimento per questo caso particolare, avrei bisogno di una guida di
riferimento sulle classi standard del C++ quali iostream, vector, string
ecc. Ne esistono in rete?
Altro problema: in una classe stack l'operatore "[]" semplicemente non serve
a niente (credo). C'č un modo per "nasconderlo" alla classe derivata stack
anche se č ereditato dalla classe base vector, o magari un modo per
semplicemente non ereditarlo? Il risultato che vorrei ottenere č che una
chiamata del tipo "A[6]" dove A sia uno stack si risolva in un errore in
compilazione.
Un'altra cosa: sto utilizzando la funzione size() per ottenere un dato che
credo sicuramente sia un dato membro di vector (una cosa tipo "_size", che
so). Credo quindi che la chiamata a size() possa essere evitata: dove posso
ricavare direttamente la stessa informazione che tale metodo mi fornisce?
Ovviamente ci saranno problemi che non ho notato (magari qualche errore
grossolano) e sarai felice se mi correggeste. E' in oltre estremamente
gradito qualsiasi suggerimento a livello di design della classe.
Grazie in anticipo.
_
Francesco "SiSkO" Napolitano

 quella standard vector. Riporto qui la mia prima piccola bozza (e piů in
I container std non sono fatti per essere usati per eredita`, e i problemi
che osservi derivano appunto da questo.  Usa *come membro* uno
std::vector invece di ereditare (o meglio ancora esamina il template di
adapter std::stack per una soluzione anche piu` elegante).
Il membro pop_back() di std::vector elimina l'ultimo elemento e
accorcia di uno la sequenza (non ha valore di ritorno, e` void).
Su MSDN (
http://msdn.microsoft.com/
) trovi una decente guida
di riferimento dell'implementazione delle librerie standard che hanno
comprato dalla Dinkumware (dovrebbe esserci anche al sito della
Dinkumware, piu` o meno eguale).
Sul sito della SGI trovi la documentazione della _loro_ implementazione
che pero` non e` standard ma ha varie aggiunte e ampliamenti e`
la STL, che e` cosa *diversa*, benche` simile, dalla libreria standard C++).
Alex

Scusa ma rileggendo il tuo posto mi sono accorto di una frase che non ho
capito:
"esamina il template di adapter std::stack"
Non so che è "adapter".
Ciao,
_
Francesco "SiSkO" Napolitano

adapter std::stack per una soluzione anche piu` elegante).
Purtroppo sto svolgendo una traccia d'esame per Lab. di ASD, non posso fare
scelte in questo senso.
Ti ringrazio per i suggerimenti.
_
Francesco "SiSkO" Napolitano

 Ti ringrazio per i suggerimenti.
Se fra le specifiche della tua classe c'e` quella che deve
ereditare pubblicamente da uno std::vector (e si tratta in
questo caso di una specifica assurda) non puoi fare nulla
di quello che chiedevi, come "rimuovere" operator[] ecc.
Quando viene il desiderio di "togliere" qualcosa dalla
classe da cui si eredita pubblicamente, e` un ottimo
segno (uno fra tanti) che ereditare e` un erroraccio di
progetto.
Alex

 Non so che è "adapter".
"Adapter" e` il nome di una design pattern abbastanza generica.
Guarda il template std::stack della libreria standard C++ e
vedrai un ottimo esempio di adapter.
Alex

questo caso di una specifica assurda) non puoi fare nulla
Gią, proprio quello.

...

Afferrato, grazie. Ciao.
_
Francesco "SiSkO" Napolitano