Newsgroup: it.comp.lang.c++
Titolo: typdef virtuale

 > B::begin()’
test.cc:9: error:   overriding ‘virtual void A::begin()’
e stessa cosa per A::end()
vorrei avere un interfaccia astratta che definisca un A::iterator in
modo da poter iterare sui suoi elementi, il tipo di iterator è però
definito dall'implementazione, c'è qualche modo per farlo?


forse ho letto troppo in fretta ma...
new B () restituisce un puntatore (di tipo B*)
che puoi assegnare ad una variabile di tipo A*
... ma non ad una variabile di tipo A

 definito dall'implementazione, c'è qualche modo per farlo?
Le variabili di ritorno devono essere covarianti, perche' il tuo codice 
funzioni A::iterator dev'essere una superclasse di B::iterator.
--*PaN!* 

 definito dall'implementazione, c'è qualche modo per farlo?
Si, si puo' fare e probabilmente in giro ci sono anche implementazioni
gia' fatte. L'idea e' avere una classe base astratta, parametrizzata
sul tipo puntato dall'iteratore, ma non sul tipo dell'iteratore
stesso, e una classe derivata concreta, parametrizzata su entrambi.
Per poter mantenere la natura di valore degli iteratori (copiabilita',
allocazione automatica, ecc.) devi avvolgere il tutto in una classe
parametrizzata sul tipo puntato che possiede un puntatore, magari
"smart", alla classe base astratta. Questa classe wrapper avra'
costruttore template sul tipo dell'iteratore, in modo da istanziare la
classe concreta opportuna. Buon lavoro!
Ciao,
Nicola

 ha scritto:

sto provando a combinare qualcosa con i template, il problema che sorge
è che mi serve una classe non parametrizzata da usare come interfaccia
in modo da poter cambiare implementazione senza ricompilare

 ricompilare
no ho detto una stronzata, se uso A::iterator come tipo quando cambio
implementazione devo ricompilare per forza.
Ciao

 
Tieni presente che l'elemento chiave dell'approccio a cui accennava Nicola
risiede nel fatto che il tipo effettivo dell'iteratore soggiacente non farà
parte dell'interfaccia e non dovrà essere visibile. In sostanza, devi poter
cambiare il modo in cui l'iteratore è implementato (perché, ad esempio,
vuoi cambiare il tipo di container) senza alterare l'interfaccia e senza,
di conseguenza, ricompilare il codice client.
Come ha detto Nicola, gli ingredienti sono:
 - una classe base template con funzionalità di iteratore
    parametrizzata sul tipo
 - una classe template parametrizzata sull'iteratore
     che implementi la suddetta interfaccia 
 - una classe wrapper per gestire comodamente il lifetime
   delle istanze della classi precedenti
Se vuoi, da qualche parte, ho qualcosa di pronto che ho scritto tempo fa. Ma
probabilmente preferisci studiarti la cosa per conto tuo.
Max

 probabilmente preferisci studiarti la cosa per conto tuo.
Spesso su Usenet quando leggi di un argomento su un newsgroup poco
dopo ne leggi anche in un altro. Sulla mailing list degli sviluppatori
Boost mi e' appena capitato sotto gli occhi questo:
http://opensource.adobe.com/classadobe_1_1any__iterator.html
Ciao,
Nicola

 visibile.
a me serve però che sia visibile e utilizzabile dal client in modo che
possa iterare sugli elementi contenuti, senza conoscere il tipo di
container.
Ciao

 Il giorno Tue, 29 May 2007 14:57:01 +0200

non avevo capito nulla di quello che avevi scritto.
ultimamente sono un po fuori :)
Ciao