#include <TFactory.h>
Diagramma di collaborazione per TFactory< T >:
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. | |
T | 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) |
|
Costruttore TFactory.
Si occupa anche di recuperare i Simboli (
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:
|
Distruttore TFactory.
Definizione alla linea 88 del file TFactory.h.
00088 {} |
|
Restituisce una istanza della Classe contenuta nella SO. L'oggetto restituito e' UP-Castato alla Classe Base "T" (parametro del Template)
Definizione alla linea 96 del file TFactory.h. Referenziato da Server::loadPlugInGames().
00096 { 00097 return ( (*builder)() ); // Ritorna la nuova istanza di T 00098 } |
|
Chiude la libreria SO.
Definizione alla linea 118 del file TFactory.h. Riferimenti TFactory< T >::handler.
|
|
Carica la libreria SO.
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 } |
|
Referenziato da TFactory< T >::TFactory(). |
|
Definizione alla linea 49 del file TFactory.h. Referenziato da TFactory< T >::closeSo(), TFactory< T >::openSo(), e TFactory< T >::TFactory(). |