Uso di funzione friend

  • 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
    }

© Ing. Stefano Salvi - All rights reserved