PDA

Visualizza la versione completa : [c++]Template e classe dati specifica


giuseppe500
18-01-2012, 12:31
ciao.
Ho varie tipologie di elemento(classi che derivano tutte dalla stessa classe base)e ho vari vector stl che contengono tutti gli elementi presenti in un documento per ogni tipologia di elemento.
Ho un visitor che uso per caricare dati e restituire una stuttura tipica della classe elemento,ad es : beam avrà una struttura BeamProperties con tutti i dati che mi servono per rappresentare quella classe ad es profondità estrusione , direzione estrusione ecc... alcuni elementi sono tipici della classe ( non si trovano nelle altre classi) e quindi tipici della struttura che rappresenta e contiene i dati delle proprietà di quella tipologia.
Il visitor ha la funzione , passato elemento per elemento ,di caricare i dati dalle classi della tipologia (ad es beam).
passo alla domanda:
dato che il visitor ha funzioni comuni che dovrei reimplementare per le varie classi tipologia , mi chiedevo se fosse possibile creare un template in modo da passare la classe specifica delle proprietà al visitor tramite template e caricarla, per poi recuperare
un vettore con tutte le classi proprietà di quel tipo dall esterno.
questo per non creare vari visitor specifici per ogni tipologia
mi spiego:



CVisitorBeam visitorBeams

for each beam in Beams
visitorBeams.accept(beam)//carico le proprietà

vector< beamProperties > vAllBeamProperties = visitorBeams.getProperties()//mi faccio restituire un vettore con le prorietà dei beams

CVisitorWall visitorWall
for each wall in Walls
visitorWall.accept(wall)//carico le proprietà

vector< wallProperties > vAllBeamProperties = visitorWall.getProperties()//mi faccio restituire un vettore con le prorietà dei wall




posso fare qualcosa del tipo:

CvisitorGeneral<tipoclasseproprietà> visitorGeneral

for each beam in Beams
visitorGeneral.accept(beam)//carico le proprietà
vector< tipoclasseproprietà> vAllSpecificsProperties = visitorGeneral.getProperties()

CvisitorGeneral<tipoclasseproprietà> visitorGeneral

//CvisitorGeneral<wallProperties> visitorGeneral

for each wall in Walls
visitorGeneral.accept(wall)//carico le proprietà
vector< tipoclasseproprietà> vAllSpecificsProperties = visitorGeneral.getProperties()
//vector< wallProperties> vAllSpecificsProperties


praticamente al visitor passo il template col tipo di proprietà specifico , istanzio un vettore di quel tipo nel visitor e lo riempio diversamente per ogni tipologia e lo restituisco.

puo essere corretto?

grazie.

shodan
18-01-2012, 17:27
A mio avviso il modo più semplice è parametrizzare la funzione.




template <typename T>
NomeClasse::getProperties(std::vector<T>& vec);



che però ha lo svantaggio di dover implementare la funzione nell'header file.

Un secondo modo è di creare un adapter che prende al costruttore il vector che ti interessa e lo riempie con un metodo apposito nella funzione getProperties().

Un terzo modo è illustrato qui:
http://www.eptacom.net/pubblicazioni/pub_it/nl_7.html
però lo trovo parecchio contorto (e potenzialmente poco efficiente).

Magari se posti il codice della getProperties() si può dire qualcosa in più.

giuseppe500
18-01-2012, 17:46
Un secondo modo è di creare un adapter che prende al costruttore il vector che ti interessa e lo riempie con un metodo apposito nella funzione getProperties().



cos è un adapter essenzialmente ?(il pattern adapter?) e come dovrebbe funzionare in questo caso se hai 2 m da spiegarmelo.

grazie

shodan
18-01-2012, 18:15
Il problema non è spiegartelo, il punto è vedere quanto e come si possa adattare a quella funzione.
Senza un esempio pratico sul tuo codice non è possibile fare alcuna assunzione.

Comunque un esempio di adapter può essere un function object che prende uno o più parametri al costruttore e li usa in operator().

Loading