Microsoft Word informaticadue doc



Scaricare 1.76 Mb.
Pdf recensione
Pagina73/140
25.04.2019
Dimensione del file1.76 Mb.
1   ...   69   70   71   72   73   74   75   76   ...   140
Stack
 
top
 
 
val 
Conten
uto
 
next
 
 
val 
Contenuto
 
next 
 
 
val 
Contenuto
 
n
ext 
Stack
 
top
 


79
 
ADELE RIMOLDI     DIPARTIMENTO DI FISICA NUCLEARE E TEORICA - UNIVERSITÀ DI PAVIA 
 
           
 
79 
 
 
 
class Contenuto { 
... 
private: 
  Contenuto* next; 
  int val;  
}; 
class Stack { 
... 
private: 
  Contenuto* top;};
 
Se quindi si vuole implementare la classe stack per gli interi e la classe contenuto un 
codice possibile alla sua implementazione è il seguente: 
 
class Contenuto { 
public: 
  Contenuto ( int i, Contenuto* ptn ) {   
            val=i; next=ptn; }  
  int getVal (){ return val; } 
  Contenuto* getNext() {return next;} 
private: 
  Contenuto* next; 
  int val;  
}; 
 
class Stack { 
public: 
  Stack() {top = 0;} 
  ~Stack() {} 
  void push ( int i ) { 
    Contenuto* tmp = new Contenuto(i,top );  
    top = tmp; } 
  int pop () { 
    int ret = top->getVal(); 
    Contenuto* tmp = top; 
    top = top->getNext(); 
    delete tmp
    return ret; 
  } 
private: 
  Contenuto* top; 
};  
 
int main() { 
Stack s; 
s.push ( 10 ); 
s.push ( 20 ); 
cout << s.pop() << “ - “ << s.pop; 
return 0; 
}; 
 
con il seguente output: 
 
 10 - 20
 
L’ implementazione della classe relativa allo stack templato diventa: 
 


80
                           
 
CORSO DI INFORMATICA PER LA  FISICA  
 
 
80 
template  
class Stack { 
public: 
  Stack() {top = NULL;} 
  ~Stack() {;} 
  void push ( T i ) { 
    Contenuto* tmp = new Contenuto (i,top );  
    top = tmp; } 
  T pop () { 
    T ret = top->getVal(); 
    Contenuto* tmp = top; 
    top = top->getNext(); 
    delete tmp; 
    return ret; 
  } 
private: 
  Contenuto* top; 
}; 
 
template  
class Contenuto { 
public: 
  Contenuto ( T i, Contenuto* ptn ) { val = i; next = ptn; } 
  T getVal (){ return val; } 
  Contenuto* getNext() {return next;} 
private: 
  Contenuto* next; 
   T val;  
}; 
 
con il relativo user code: 
int main() { 
Stack s; 
s.push ( 10 ); 
s.push ( 20 ); 
Stack s1; 
Stack s2; 
cout << s.pop() << “ “ << s.pop; 
return 0;}; 
 
Quando viene dichiarata una istanza specifica di stack il compilatore genera 
automaticamente tutte le funzioni e le variabili necessarie per gestire i dati 
effettivamente impiegati. Nell’esempio vengono usati un tipo di stack per 
double
 e per 
un tipo 
Shape *

 
typename 
È una parola chiave (insieme ad 
export
) riservate in modo specifico ai template. Il 
primo utilizzo è quello relativo alla sostituzione della parola 
class
 nella dichiarazione 
di un template. Oppure, come nell’esempio seguente, essa indica il tipo generico:  
 


81
 
ADELE RIMOLDI     DIPARTIMENTO DI FISICA NUCLEARE E TEORICA - UNIVERSITÀ DI PAVIA 
 
           
 
81 
template  
class MyClass { 
typename T::SubType *ptr; 
//ptr è un puntatore al tipo T::SubType 
… 
};
 
template  
class MyClass { 
T::SubType *ptr; 
//significherebbe membro statico 
//si farebbe una moltiplicazione del valore  
//SubType con ptr… 
}; 
 
Si informa il compilatore che un nome utilizzato nella dichiarazione di un template fa 
riferimento ad un tipo  e non al nome di un oggetto. Ogni identificatore di un template è 
considerato essere un valore a meno che sia qualificato da 
typename. 
Un altro esempio: la classe Queue 
Si vuol definire una classe che supporti il meccanismo di una coda. 
Struttura di dati che si vuol costruire riguarda  una collezione di oggetti aggiunti al 
fondo e rimossi in alto (FIFO). 
Le operazioni da introdurre sono quindi: 

 
Aggiungere un elemento al fondo 

 
Rimuovere un elemento all’inizio 

 
Determinare se la coda è vuota 

 
Determinare se la coda è piena 
Esse vengono espletate da opportuni metodi: 
 
void add(item); 
item remove(); 
bool_is empty(); 
bool is_full(); 
 
La definizione della classe sarà: 
 
class Queue{ 
public: 
  Queue(); 
  ~Queue(); 
  Type& remove(); 
  void add(const Type& ); 
  bool is_empty(); 
  bool is_full(); 
private: 
// … 
}; 
 
Quale tipo per Type? 
int 
In questo caso se è assegnato un valore diverso esso viene automaticamente 
convertito in 
int,
 se la conversione esiste, altrimenti  a compile-time appare un 
errore. 
 

1   ...   69   70   71   72   73   74   75   76   ...   140


©astratto.info 2017
invia messaggio

    Pagina principale