- Trasformiamo il metodo per cercare in friend
- Per primo riporterò il file header
// Classe lista: listc.h
#ifndef LISTC_H
#define LISTC_H
class list {
list *next; // private
static list *base; // Base della lista, statica
protected :
virtual int compare (const void *el) = 0; // Virtuale pura
list *Next () { return next; }; // Inline
list *ElSearch (const void *el); // Esegue la ricerca vera e propria
public :
list () {next = base; base = this;}; // Costruttore Inline - aggiunge alla lista
friend list *Search (const void *el); // Metodo pubblico STATICO
};
#endif
- Ed il file C++ che implementa Search
// Classe lista: listc.cpp
#include "listc.h"
list *list::base = (list*) 0; // Definisco l'attributo statico dichiarato nella classe
list *list::ElSearch (const void *el)
{
if (compare (el)) // Chiama 'compare', virtuale
return Next () -> ElSearch (el); // Se non e' questa, cerca la prossima
else return this; // Se e' questa, ha finito
}
list *Search (const void *el)
{ // Questa funzione friend richiama la ElSearch sulla base (statica) della lista,
// pur essendo la base privata e la funzione ElSearch protetta
return list::base -> ElSearch (el); // Se non e' questa, cerca la prossima
}
- L'header file e il sorgente
per slilt non cambiano
- Per finire, il nuovo file con un piccolo 'main' (un piccolo Makefile)
// Programma : main.cc
#include <stdio.h>
#include "slistc.h" // include anche list.h
/* Array degli elementi da costruire */
char *strs [] = { "uno", "due", "tre" , ""};
void main (){
for (int i = 0; strs [i][0]; i ++) // Ciclo di creazione degli elementi
new slist (strs [i]); // Creo il singolo elemento
printf ("%s\n", ((slist *) Search ("due")) -> string ()); // Ricerca
}
|