Template per la classe TFactory< T >

#include <TFactory.h>

Diagramma di collaborazione per TFactory< T >:

Collaboration graph
[legenda]
Lista di tutti i membri.

Descrizione Dettagliata

template<class T>
class TFactory< T >

Questa Classe Template ha il compito di Istanziare a Run-Time Classi la cui Dichiarazione e Definizione non e' avvenuta a Compile-Time.

In sostanza, si parla di realizzare un sistema per la gestione di quelli che, in gergo, si chiamano Plug-In: mini-programmi che si aggiungono ad altri piu' grandi per aumentarne le funzionalita'.

E' una "Factory" di Classi Plug-In.
Carica da libreria SO la definizione di una Classe che ha come Classe di Base il Parametro passato alla Factory: in questo modo e' sufficiente, per realizzare classi Plug-In, che le Classi da Istanziare a Run-Time implementino un'interfaccia comune.

Per la precisione, e' anche necessario che nella libreria SO che contiene la classe sia presente una funzione cosė definita:

extern "C"
*buildObject(void) { return new ; }

buildObject(void) crea effettivamente una istanza della Classe Plug-In.

Questa soluzione permette quindi di caricare nuove Classi senza bisogno ne di ricompilare, ne di modificare il codice.

Definizione alla linea 40 del file TFactory.h.

Membri pubblici

 TFactory (const string &)
 Costruttore TFactory.

 ~TFactory ()
 Distruttore TFactory.

build ()
 Restituisce una istanza della Classe contenuta nella SO.

void closeSo ()
 Chiude la libreria SO.


Membri privati

void openSo (const string &)
 Carica la libreria SO.


Attributi privati

void * handler
T(* builder )(void)


Documentazione dei costruttori e dei distruttori

template<class T>
TFactory< T >::TFactory const string &  soLibPath  ) 
 

Costruttore TFactory.

Si occupa anche di recuperare i Simboli ("buildObject" ) necessari all'istanziazione di una nuova T Class.

Parametri:
soLibPath Path alla Libreria SO da dove caricare la definizione della Classe

Definizione alla linea 64 del file TFactory.h.

Riferimenti TFactory< T >::builder, TFactory< T >::handler, e TFactory< T >::openSo().

00064                                              {
00065    try {
00066       /* Caricamento della SO */
00067       openSo(soLibPath);
00068       /* Casting necessario per una corretta assegnazione
00069        * della funzione al relativo puntatore */
00070       *(void **) (&builder) = dlsym(handler, "buildObject");
00071       /* Controlla che il Simbolo Cercato ("buildObject") sia
00072        * stato trovato... */
00073       if ( builder == NULL ) { // Errore nel caricamento della funzione
00074          /* ...in caso negativo, lancia un TFactoryException */
00075          string exceptionMessage("<TFactory msg> ERROR: ");
00076          exceptionMessage += dlerror();
00077          throw TFactoryException(exceptionMessage);
00078       }
00079    }
00080    catch ( TFactoryException &e ) {
00081       throw e;
00082    }
00083    cout << "<TFactory msg> Plug-In Loaded. Library-Path: "<< soLibPath << endl;
00084 }

Questo č il grafo delle chiamate per questa funzione:

template<class T>
TFactory< T >::~TFactory  ) 
 

Distruttore TFactory.

Definizione alla linea 88 del file TFactory.h.

00088 {}


Documentazione delle funzioni membro

template<class T>
T TFactory< T >::build  ) 
 

Restituisce una istanza della Classe contenuta nella SO.

L'oggetto restituito e' UP-Castato alla Classe Base "T" (parametro del Template)

Restituisce:
Una nuova istanza di T (T = Parametro di TFactory)

Definizione alla linea 96 del file TFactory.h.

Referenziato da Server::loadPlugInGames().

00096                      {
00097    return ( (*builder)() ); // Ritorna la nuova istanza di T
00098 }

template<class T>
void TFactory< T >::closeSo  ) 
 

Chiude la libreria SO.

Definizione alla linea 118 del file TFactory.h.

Riferimenti TFactory< T >::handler.

00118                           {
00119    if (handler) {
00120       dlclose(handler);
00121       handler = NULL;
00122    }
00123 }

template<class T>
void TFactory< T >::openSo const string &  soLibPath  )  [private]
 

Carica la libreria SO.

Parametri:
soLibPath Libreria SO da caricare

Definizione alla linea 105 del file TFactory.h.

Riferimenti TFactory< T >::handler.

Referenziato da TFactory< T >::TFactory().

00105                                                 {
00106    /* Apertura della Libreria SO */
00107    handler = dlopen( soLibPath.data(), RTLD_NOW);
00108    
00109    if (!handler) {
00110       string exceptionMessage("<TFactory msg> ERROR: ");
00111       exceptionMessage += dlerror();
00112       throw TFactoryException(exceptionMessage);
00113    }
00114 }


Documentazione dei dati membri

template<class T>
T(* TFactory< T >::builder)(void) [private]
 

Referenziato da TFactory< T >::TFactory().

template<class T>
void* TFactory< T >::handler [private]
 

Definizione alla linea 49 del file TFactory.h.

Referenziato da TFactory< T >::closeSo(), TFactory< T >::openSo(), e TFactory< T >::TFactory().


La documentazione per questa classe č stata generata a partire dal seguente file:
Generato il Sun Nov 28 13:27:34 2004 per MGS - Multithreaded Game Server da doxygen 1.3.4