Newsgroup: it.comp.lang.c++
Titolo: Probemi con typeid (C++)

Ciao, 
stavo provando per la prima volta l' utilizzo di typeid() per identificare
il tipo di oggetto puntato dal puntatore alla classe base. 
Se la gerarchia di classi e' polimorfica, in fase di compilazione ottengo
il seguente warning: 
warning C4541: 'typeid' used on polymorphic type 'class animali' with
/GR-; unpredictable behavior may result 
Ovviamente il programma si blocca in esecuzione. 
Se la gerarchia delle classi NON e' polimorfica (rimuovo la parola chiave
virtual), il programma funziona correttamente. 
Vi allego il programmino: 
#include <iostream>
#include <typeinfo>
using namespace std;
class animali
{
public:	
	virtual bool  asd() { return false;}
};
class cane : public animali
{
	//...
};
class gatto : public animali
{
public:
	 bool asd() { return true;}
};
void main(void)
{
	animali *p, ob_anim;
	gatto ob_gatto;
	cane ob_cane;
	p = &ob_anim;
	cout <<" p punta ad un oggetto del tipo: ";
	cout << typeid(*p).name() << endl;
 
	p = &ob_gatto;
	cout <<" p punta ad un oggetto del tipo: ";
	cout << typeid(*p).name() << endl;
 
	p = &ob_cane;
	cout <<" p punta ad un oggetto del tipo: ";
	cout << typeid(*p).name() << endl;
}
Qualcuno mi puo' aiutare ?? 
Grazie
---------------------------------------------------------------------------
Messaggio inviato attraverso 
http://www.trucchiperpc.it
 - sezione newsgroup

"Sergio" ha scritto

tranne il fatto che mi dice che main deve tornare un int ( int main(void)
... ma poi non si dovrebbe mettere anche un return 0 ? ), me lo ha compilato
sia con il mingw che con il Borland C++ Compiler 5.5.
Su che piattaforma e con che compilatore ti da' questo errore?
ciao,
Sinetris
PS: Gli output generati dai due compilatori sono diversi.
Su minw mi esce:
p punta ad un oggetto del tipo: 7animali
p punta ad un oggetto del tipo: 5gatto
p punta ad un oggetto del tipo: 4cane
mente sul compilatore borland:
p punta ad un oggetto del tipo: animali
p punta ad un oggetto del tipo: gatto
p punta ad un oggetto del tipo: cane

Ho trovato il problema,  il mio compilatore Microsoft Developer Studio '97
di default non inserisce tra le opzioni di compilazione e linking il
parametro /GR che sta a significare "Enable Run-Time Type Information" (
ovvio che non riuscivo a farlo funzionare  )  :-)
Per cio' che riguarda   " int main(void )" ,    in teoria  in C++ la
mancanza di parametri nella main() sta a significare void, ( dversa
situazione in C, dove una main o funzione senza parametri equivaleva ad un
int).
Grazie per il valido aiuto.
Ciao
Sergio


 Sergio
Ciao
Sinetris

 int).
Nel C++ standard il main *deve* ritornare int. Il return è opzionale, se non
specificato altrimenti ritorna automaticamente 0.
Ciao

 ha scritto nel messaggio
news:QHiUa.204263$Ny5.5...@twister2.libero.it...
wonderboy ha gia' risposto ... il mingw e' standard il borland no :-p


giusto, ma come ho scritto poco tempo fa':
#include <string>
#include <iostream>
#include <cwchar>
using namespace std;
int main() {
    wstring s = L"stringa di testo";   //errore qua
    return 0;
}
 mi da' errore se cerco di compilarlo con mingw, mentre lo compila
perfettamente con il Borland C++ Compiler 5.5.
Forse il mingw non č tanto standard ;) ( non implementa completamente il g++
visto che sotto linux l'esempio di sopra lo compila benissimo)

 visto che sotto linux l'esempio di sopra lo compila benissimo)
bhe visto che il mingw e' ancora sul gcc 3.2.3 che e' di un bel po' di mesi
fa' e che quel bug lo hanno scoperto lo stesso periodo e che quasi nessuno
ci sviluppa in modo professionale in win con mingw :-/ non c'e' la patch per
far funzionare quel comando ... quando si decideranno a lanciare il 3.3 del
gcc con le librerie vedremo se sara' ancora scoperto ...
in compenso non spendi granche a usare il mingw e molte volte si comporta
meglio degli avversari, magari non molto in ottimizzazione, ma le carte per
essere professionale penso ci siano ... ora mancano solo sviluppatori che ci
credano ... invece di avere la pappa pronta di vc o i classici bug di
borland (ne ho provati 2-3 dos e non ... ma qualche bug saltava sempre
fuori)
ciao

 int).
In C++ l'assenza di parametri tra le parentesi della dichiarazione di
una funzione indica che la funzione non prende parametri; in C *non*
specifica quali parametri la funzione prende.
Ciao,
Nicola

 del mingw), pero' se non metto int non compila
Quello che chiami "nuovo" standard non solo e' l'unico esistente, ma
e' stato approvato nel 1998. In termini informatici e' quasi
preistoria...
Lo standard prevede che main restituisca un int. Il MinGW ha
perfettamente ragione.
Ciao,
Nicola