Entra

View Full Version : [C++]Typeid


Kleidemos
11-04-2003, 19:31
Sviluppando la mia lib, sono incappato in un problema:

/**
* <b>Virtuale:</b> no
* <b>Funzione:</b> Parserizza le informazioni
* <b>Argomenti:</b> constante a Object
* <b>Return:</b> -
* <b>Eccezioni:</b> -
*/
void Object::ParseInfo(const Object *obj)
{
if(typeid(obj) == "Conf")
{
Conf* sel = dynamic_cast< Conf* >(obj);
if(sel){
sel->Info();
}
}
if(typeid(obj) == "Time")
{
Time* sel = dynamic_cast< Time* >(obj);
sel->Info();
if(sel){
sel->Info();
}
}
if(typeid(obj) == "App")
{
App* sel = dynamic_cast< App* >(obj);
sel->Info();
if(sel){
sel->Info();
}
}
}

}

Non va......................mi sai aiutare?

/\/\@®¢Ø
11-04-2003, 21:22
devi sostituire typeid(sel) con typeid(sel).name()
In ogni caso non ti funzionera' come vuoi il codice: il nome che ti viene restituito non e' detto che sia quello che ti aspetti , e' piu' una sorta di nome interno (col gcc ad esempio otterresti qualcosa del tipo "4Conf", "4Time" e "3App").

Per farlo funzionare puoi fare qualcosa del genere:

if ( typeid(sel) == typeid( Conf* ) )
{ ... }


Ma non e' secondo me la soluzione adatta.
Piuttosto cerca di sfruttare il polimorfismo degli oggetti, ridefinendo per ogni sottoclasse un metodo che faccia delle cose differenti.

Kleidemos
12-04-2003, 05:49
ma infatti tutte le funz Info() sono overridding della Info() di Object che è virtual.
Ma io voglio che ParseInfo() scielga in base a quello che gli passo l'Info() da sciegliere ;)

cionci
12-04-2003, 08:36
Allora non serve...basta usare un puntatore all'oggetto base e fare: pun->info(); ed automaticamente verrà scelta la info() giusta... Altrimenti a cosa serve la derivazione ?!??!?

soalle
12-04-2003, 09:40
:eek: il polimorfismo è questo...

Kleidemos
12-04-2003, 11:58
/**
* <b>Virtuale:</b> no
* <b>Funzione:</b> Parserizza le informazioni
* <b>Argomenti:</b> constante a Object
* <b>Return:</b> -
* <b>Eccezioni:</b> -
*/
void Object::ParseInfo(const Object *obj)
{
*obj->Info();
}
cosi mi da:

Lib/object.cpp: In member function `void LucLib::Object::ParseInfo(const
LucLib::Object*)':
Lib/object.cpp:38: passing `const LucLib::Object' as `this' argument of `
virtual void LucLib::Object::Info()' discards qualifiers
Lib/object.cpp:38: void value not ignored as it ought to be

/\/\@®¢Ø
12-04-2003, 13:17
Originally posted by "Kleidemos"


/**
* <b>Virtuale:</b> no
* <b>Funzione:</b> Parserizza le informazioni
* <b>Argomenti:</b> constante a Object
* <b>Return:</b> -
* <b>Eccezioni:</b> -
*/
void Object::ParseInfo(const Object *obj)
{
*obj->Info();
}
cosi mi da:


Non puoi passare un oggetto "const" come parametro se poi usano metodi che lo modificano. In questo caso il metodo info non e' stato dichiarato const.
Da qualche parte avrai scritto qualcosa come

class Object {
/* ... /*
void Info();
/*...*/
};

devi cambiare la dichiarazione di Info in

void Info() const;

ad indicare che il metodo non modifica l'oggetto su cui lo chiami. Ovviamente questo funziona se effettivamente non lo modifichi, altrimenti devi togliere il "const" da ParseInfo

/\/\@®¢Ø
12-04-2003, 13:19
occhio che hai fatto un altro errore:

*obj->Info();

va scritto senza l'asterisco ( la freccia fa gia' da sola la dereferenziazione )

cionci
12-04-2003, 13:21
Inoltre se usi il derefernce (l'asterisco) allora non devi usare ->...

Quindi:

(*obj).Info(); ovvero obj->Info();