Newsgroup: it.comp.lang.c++
Titolo: Utilizzare una classe da una stringa

Devo istanziare una classe il cui nome della classe dipende da una
variabile data, ecco un esempio
std::string nomeclasse("MyClass");
//ora devo fare in modo di istanziare la classe MyClass, cosi:
MyClass istanza();
istanza.Metodo();
//...........
Solo che invece di definire MyClass a livello di sorgente devo
utilizzare il valore contenuto nella stringa nomeclasse. appunto perchè
il valore potrebbe variare facendomi istanziare un altra classe.
Come posso fare?
Ciao
Terenzio

usa le RTTI
#include <typeinfo>
...
const type_info& tipo = typeid(MyClass);
cout << "Il tipo della classe e' "<< 
tipo.name
() << endl;
...
su alcuni compilatori va attivato il supporto.
--
____ __         __,_      __  _____
\  _\_ \  ___ _/ / /\  /\/  \/ / _/ It is better to reign in Hell
 \  _ \ \/ _ '/ , |\ VV / / / / _/ Than serve in Heaven.- MILTON
  \_,_/\_\_,_/_/|_| \__/\__/_/_/
      -- the one and only --     e-mail : 
blak...@tiscalinet.it
                                ICQ    : 59394345
The UNIX Guru's View of Sex:
$unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep

 Come posso fare?
Suppongo che la scelta tra le classi istanziabili a partire da una stringa
non sia grossissima, o comunque non corrisponda a tutte le classi del tuo
codice. Il primo sistema che mi viene in mente č definire una mappa che
converta le stringhe in puntatori a classi dei tipi validi.
Forse č possibile anche definire una mappa da stringhe a qualche typeinfo
(RTTI) tramite il quale poi istanziare le classi, ma non ne sono sicuro
visto che non uso mai RTTI (anche perché l'implementazione nel Visual C++
attualmente lascia alquanto a desiderare).
Ciao
-----
Giovanni Bajo
Lead Programmer
Prograph Research S.r.l.
http://www.prograph.it

 attualmente lascia alquanto a desiderare).
E` un po' lenta, ma che altri problemi avrebbe?  Mi pareva funzionante.
Comunque, RTTI Standard non comprende meccanismi per istanziare
classi arbitrarie sulla base della type info.
Alex

 classi arbitrarie sulla base della type info.
Infatti, lo supponevo.


 tendeva anche a destabilizzare il tutto, mandando in crash l'applicativo ...
Potresti spiegare meglio. Solo per capire cosa accade, in quanto
tempo fa ho avuto problemi analoghi, ma poi mi sono accorto che ero
io che lo usavo male.
Fausto

 io che lo usavo male.
Ok, vado con l'esempio pratico. Io ho una classe base, chiamamola
BaseObject, da cui derivo TANTISSIME classi, con vari casi anche di eredità
multipla.
In un certo punto del codice, processo una lista di BaseObject. Per motivi
vari, volevo eseguire un metodo particolare SOLO se il BaseObject corrente
era di tipo MyObject.
while (scorrolalista)
{
    BaseObject* o = elementocorrente;
    o->Process();
    MyObject* mo = dynamic_cast<MyObject*> (o) ;
    if (mo)
    {
        mo->MyObjectMethod();
    }
}
Questo non funzionava correttamente: alcuni oggetti appartenenti a classi
derivate da MyObject inspiegabilmente non venivano riconosciuti come
MyObject (il dynamiccast tornava NULL), e, visto che compilando in release
con le ottimizzazioni, il tutto tendeva a crashare, suppongo anche che
avvenisse anche il contrario, cioé alcuni oggetti venivano castati a
MyObject senza esserlo.


 
Strano cio' che dici. 
Uso una tecnica del genere e non ho mai avuto problemi,
sia su Visual che su HP/aC++ che su GNUPro della Cygnus.
Tra l'altro, come ha scritto anche Alex Martelli, cosa c'e' che non va
nel RTTI del Visual C++, sara' lento (dipende in funzione di cosa si 
deve fare, a mio modesto parere) ma funziona bene.
Quello che mi viene da chiedere e':
- Le classi da cui fai una derivazione multipla sono di tipo 
polimorfico?
- MyObject e' polimorfica?
Fausto

 - MyObject e' polimorfica?
Beh, chiaro, altrimenti non avrebbe senso il ciclo di cui sopra, no? Ho
detto che da MyObject derivo un sacco di classi diverse, ciascuna delle
quali implementa la Process in modo diverso.
