Newsgroup: it.comp.lang.c++
Titolo: Repost: Semplice problema; qualcuno mi sa consigliare ?

Saluti a tutti,
	Riprovo a sottoporre i dubbi che mi hanno attanagliato in questo week
end, sperando che questa volta qualcuno voglia darmi una mano !
Ecco il problema:
In un progetto C++ (ovviamente) vorrei raggruppare tutte le funzioni di
gestione dell'output in una classe, in modo da poterne fornire differenti
implementazioni (output testuale, con libreria xy, libreria yz, ecc.) a
compile time. A questo fine ho preparato una classe Screen che fornisce
l'interfaccia, e delle classi derivate TextScreen, NCursesScreen, ecc.
ecc. I metodi dell'interfaccia richiedono, per varie ragioni, un handler;
per questo motivo ho costruito un'interfaccia di questo tipo:
Class Screen
{
    virtual Handler getView() = 0;
    virtual void destroyView(Handler h) = 0;
    virtual int print(Handler h, string msg) = 0;
}
getView() e destroyView() si occupano della produzione e distruzione degli
handler; le funzioni di output, come print(), richiedono l'handler per
operare. Il problema si presenta implementando le classi derivate: ogni
implementazione avra', in genere, un suo tipo di handler; per esempio
NCursesScreen utilizza handler di tipo WINDOW* .
L'unica soluzione che sono riuscito a trovare e' quella di fornire una
classe ScreenHandler vuota, da cui derivare i vari NCursesScreenHandler,
ecc. :
    class ScreenHandler {};
    class NCursesScreenHandler : public ScreenHandler 
    {
        public:
        WINDOW* window;
    };
e di modificare cosi' l'interfaccia:
    virtual ScreenHandler* getView() = 0;
    destroyView(ScreenHandler* h) = 0;
    virtual int print(ScreenHandler* h, string msg) = 0;
Per quanto funzionante, questa scelta non mi convince del tutto, forse
perche' non ho le idee chiarissime al riguardo; mi potreste consigliare se
esiste qualche soluzione "migliore", o eventuali correzioni ?
Ringrazio anticipatamente per l'aiuto.
    Saluti,
	Marco Palestro
< Anche un maiale puo' scalare una palma se adulato >

     virtual int print(ScreenHandler* h, string msg) = 0;
L'idea non è cattiva, soprattutto se deleghi a questa classe la gestione
della memoria relativa agli handle.
Purtroppo non ho ben capito il problema e, soprattutto, come intendi
utilizzare questi handler nel metodo print().
Potresti addirittura fare di Screen una classe template.
-- 
Domenico Testa - Studente

 
Ho effettivamente pensato ai template, ma non mi sembra che possano
essermi utili: queste non sono classi generiche, ma implementazioni
differenti di una interfaccia. Credo che sia un altro genere di problema.
Spero di essermi spiegato un po' meglio... Per adesso grazie per
l'attenzione dedicatami !
Ciao,
	Marco Palestro


Allora, non sono sicuro di aver capito bene (si, ti sei già spiegato 2 
volte, ma i probleami come quello che stai affrontanto tu sono tremendi, 
ne so qualcosa), ma non capisco perchè l'handler debba essere visibile 
all'esterno. Mi spiego meglio. Volendo potrei definire l'interfaccia come:
class Interface
{
	public:
		virtual void draw();
		virtual void drawCursor();
		// etc.
};
e poi da qui derivare le classi come NCurses eccetera, ciascuna delle 
quali ha come membro privato il proprio handler. Nel caso di Ncurser, se 
il programma vuole usare quella vista può fare:
Interface *view = new NCurser();
e poi usare tranquillamente view->draw() ad esempio. E' cioè il 
puntatore stesso ad essere usato come un handler. Se questa soluzione 
non ti va bene, allora fammi sapere, anche privatamente a 
happy_emiCHIOCIOLAtin.it (dome metti @ al posto di CHIOCCIOLA).

 happy_emiCHIOCIOLAtin.it (dome metti @ al posto di CHIOCCIOLA).
Certo, anche questa potrebbe essere una soluzione. Ma la classe Screen si
occupa di gestire lo schermo, e io ho un solo schermo ;-)
Scherzi a parte, nel mio progetto sta bene avere una sola istanza della
classe Screen (o meglio di una delle sue derivate), per vari motivi:
esistono altri dati che devono essere gestiti ecc. ecc.
Non potendo prescindere da questa scelta, resta il problema di ottenere
dei riferimenti alle varie viste, ma devo dire che, dopo questa
discussione, inizio a pensare che, fatte queste scelte, non ci siano altre
alternative. Potrebbe essere interessante rivedere l'interfaccia, cioe'
lavorare al livello precedente... Se a qualcuno interessa...
Grazie e ciao a tutti !
	Marco Palestro